Fügen Sie in Rails 3.1 einen neuen Asset-Pfad hinzu

78

Weiß jemand, wie man der Asset-Pipeline in Rails 3.1 einen weiteren Ordner hinzufügt?

Ich möchte app/assets/fontsgenauso dienen, wie app/assets/imageses serviert wird.


Update: 5-7-2013

Nur um einige Erläuterungen für zukünftige Personen, die diese Frage finden, hinzuzufügen, um explizit einen Asset-Pfad in Ihrer application.rb-Datei hinzuzufügen:

config.assets.paths << "#{Rails.root}/app/assets/fonts"

Da sich der obige Pfad jedoch unter befindet, müssen app/assetsSie ihn nicht explizit hinzufügen. Sie müssen lediglich Ihre Rails-App neu starten, damit Sprockets ihn abrufen kann.

Sie müssen explizit Pfade hinzufügen , die außerhalb sind app/assets, lib/assetsoder vendor/assets, und nur daran erinnern , dass während Pinion neue Dateien in Ordnern aufgreift , die vorhanden waren , wenn die Anwendung geladen wird , in meiner Erfahrung es keine neuen Ordner in den Asset - Pfade nicht abholen ohne ein Neustart.

Andrew
quelle
config.assets.paths << "#{Rails.root}/app/assets/active_admin"arbeitet nicht für mich. Beim Versuch, eine bestimmte Seite nach der Bereitstellung für die Bereitstellung anzuzeigen, wird immer noch eine Fehlermeldung angezeigt, dass die .jsDatei in diesem Ordner nicht kompiliert wurde.
Sixty4bit

Antworten:

74

Andrew app/assets/fontsist tatsächlich bereits in Ihrem Asset-Ladepfad, zusammen mit images. Sie können also einfach auf die gleiche Weise auf das Asset verweisen: <%= asset_path('/Ubuntu/Ubuntu-R-webfont.eot') %>[1] oder wie auch immer Sie auf Ihre Bilder verweisen.

Ich brauchte eine Weile, um mich auch darum zu kümmern. Ich weiß immer noch nicht, was passiert, wenn eine Datei mit demselben Namen in app/assets/fontsund enthalten ist app/assets/images.

[1] Angenommen, Sie haben eine Schriftart bei app/assets/fonts/Ubuntu/Ubuntu-R-webfont.eot

Jason L Perry
quelle
21
Für das, was es wert ist, habe ich es versucht und es schien nicht zu funktionieren. Dann habe ich geraten config.assets.paths << "#{Rails.root}/app/assets/fonts"und das hat funktioniert. Ich denke, Sie haben Recht, dass alles unter /assetsautomatisch aufgenommen werden soll, aber aus irgendeinem Grund gab es 404, bis ich die obige Zeile zu meiner application.rbDatei hinzufügte . Ich werde Ihre Antwort jedoch akzeptieren, weil ich denke, dass sie korrekt sein wird, wenn die Veröffentlichung abgeschlossen ist, und weil mit diesem Kommentar jeder, der sie liest, es herausfinden kann :)
Andrew
39
Ich bin auch nur darauf gestoßen, und es funktioniert mit den Standardeinstellungen, ABER die Verzeichnisse werden während der App-Initialisierung gescannt. Wenn Sie also nach dem Ausführen Ihres Servers einen Ordner wie Schriftarten hinzufügen, erhalten Sie eine 404. Starten Sie also immer neu, wenn Sie eine hinzufügen Verzeichnis in Ihrer Asset-Pipeline.
Martin Wawrusch
4
So gehen Sie auf gleichnamige Dateien ein: Bei Namenskonflikten wird als erster Pfad im config.assets.pathsArray die ausgewählte Datei angezeigt . Dies kann vermieden werden, indem der asset_path()Helfer verwendet und das Verzeichnis angegeben wird.
Joseph Ravenwolfe
1
Beachten Sie, dass das Problem mit dem doppelten Namen normalerweise kein Problem darstellen sollte. Die zu bedienenden Assets haben normalerweise ein anderes Format, sodass dieses Problem nicht auftritt. Auch die Asset-Pipeline gibt Assets einen Startwert im Namen. Dies ist A, um die lokale Schreibweise des Browsers des Benutzers zu unterbrechen, aber auch, um sicherzustellen, dass alle Dateien einen eindeutigen Namen haben. Beim Vorkompilieren (das Sie in der Produktion ausführen) wird in der App eine Yaml-Datei erstellt, die die generierten Dateien mit dem ursprünglichen Pfad verknüpft. Dies ermöglicht eine schnelle Verknüpfung von der In-Code-Benennung zum kompilierten Asset-Namen. Dies vermeidet gleichzeitig die Probleme mit doppelten Namen.
Yopefonic
Dies wurde hier perfekt beantwortet: stackoverflow.com/a/10907276/1407541
Kopty
43

Andrew, Jason, stimmte zu. FWIW Ich habe dies in meiner config / application.rb neben

  # Enable the asset pipeline
config.assets.enabled = true
config.assets.paths << "#{Rails.root}/app/assets/fonts"
Peter Ehrlich
quelle
15
Nach dem, was ich gesehen habe, ist die bevorzugte Schreibweise dies jetztRails.root.join('app', 'assets', 'fonts')
Ross Allen
1
Ein bisschen ärgerlich , wenn von Google Suche nach einem Weg , um tatsächlich einen neuen Asset - Pfad hinzufügen und die akzeptierte Antwort erreicht eigentlich nicht die Aufgabe: p (Der Fragesteller hat nicht wirklich das zu tun , benötigt hat, aber das ist , was in dem aufkommt Suchergebnisse). Also ... +1 für die Beantwortung der Titelfrage, anstatt das Problem des OP zu lösen.
nzifnab
config.assets.paths << "# {Rails.root} / app / assets / fonts" funktionierte für mich auf Rails 3.2.13
dc10
@ dc10 Verwenden Rails.root.joinsollte so sein, wie Sie es tun, um plattformübergreifend flexibel zu sein.
ocodo
8

Durch das Erstellen app/assets/imagesund app/assets/fontswerden sie automatisch zum Assets-Pfad hinzugefügt.

Öffnen Sie die Rails-Konsole nach dem Erstellen und überprüfen Sie Folgendes:

y Rails.application.config.assets.paths 

( yist eine Abkürzung für die yamlMethode)

ocodo
quelle
3

Es funktioniert ohne Hinzufügen des Pfads. Achten Sie jedoch darauf, dass Sie einen gültigen Dateinamen für das Asset verwenden.

url("#{asset_path 'fontawesome-webfont.eot'}?#iefix") format('embedded-opentype'),
...
url("#{asset_path 'fontawesome-webfont.svg'}#FontAwesome") format('svg');

Lassen Sie in diesem Fall beispielsweise ?#iefixden Namen der Schriftartdatei außerhalb

montrealmike
quelle
Vielen Dank! Dies war die Ursache für einen Assets: Vorkompilierungsfehler, den ich nach dem Hinzufügen von Schriftarten sah, was zu einer sehr wenig hilfreichen "Rake abgebrochen! Undefinierte Methode" Übereinstimmung "für nil: NilClass" führte
Geoff
Hoppla! Eigentlich wurde mein eigentliches Problem damit behoben: stackoverflow.com/questions/14775844/…
Geoff
2

Ich kann bestätigen, dass es funktioniert, ohne die neuen Pfade zur Konfiguration in Rails 3.1.0.rc4 (und vermutlich höher) hinzuzufügen. Ich habe meinen Server zurückgeworfen, Sie könnten das gleiche tun.

mv_house
quelle
1

Erstellen Sie einen assets/fontsOrdner, fügen Sie eine Schriftart hinzu und verwenden Sie das Thema in Ihrer CSS-Datei wie folgt

@font-face {
  font-family: Sawasdee;
  src: url(Sawasdee.ttf);
}
SMMousavi
quelle