2013-07-12 10 views
31

ich eine Rails-4-Anwendung haben mitjavascript_include_tag Rails 4 Erzeugen "/ Javascripts /" anstelle von "/ assets" in der Produktion

<%= javascript_include_tag "modernizr", "data-turbolinks-track" => true %> 

im Kopf. In der Entwicklung wird die folgende HTML gerendert, und modernizr geladen wird:

<script data-turbolinks-track="true" src="/assets/modernizr.js?body=1"></script> 

In der Produktion der followign HTML gerendert wird, und modernizr ist nicht geladen (404 nicht gefunden):

<script data-turbolinks-track="true" src="/javascripts/modernizr.js"></script> 

In der Produktion ist /assets/modernizr.js gefunden und durchsuchbar.

Die Rails documentation sagt, dass die javascript_include_tag

<script data-turbolinks-track="true" src="/assets/modernizr.js?body=1"></script> 

In der Produktion erzeugen sollte, meine stylesheet_link_tag s sind in Ordnung, die Anbindung an das /assets/ Verzeichnis.

Warum ist die javascript_include_tag Verknüpfung zu /javascripts anstelle von /assets in Produktion, und wie kann ich es beheben?

+2

Haben Sie eine Lösung für dieses zu finden verwalten hinzufügen ? Ich habe genau das gleiche Problem, aber keine der Antworten hier hilft. – gregoltsov

+2

in Produktion, sollten Sie eine Fingerabdruck Asset-URL wie '/ Assets/Light-0cd9377b97b67182b68c8023bd6c2fbe.css' – phoet

+1

Ist das saubere Rails 4 App oder ein Upgrade von früheren Rails-Version? –

Antwort

21

Einer der Nutzungsanweisungen für AssetUrlHelper gibt es produzieren/Javascripts/Urls wie das, was Sie sehen:

# asset_path "Anwendung", Typ: javascript # => /javascripts/application.js

(von asset_url_helper.rb Linie 117 - [1])

Dieser Code sieht aus wie es nur, wenn der vorkompilierte Asset fehlt erreicht werden kann, so würde es Ihre Asset-Compilation erscheint, dass nicht (meine Einsätze in der Regel arbeitet scheitern, wenn das passiert, also vielleicht deins nicht einmal feuern).

Das gleiche asset_url_helper.rb ruft der/Javascripts/Teil 'EXTNAME' und verwendet die folgende Karte zu wissen, wie Sie den Namen generieren:

# Maps asset types to public directory. 
    ASSET_PUBLIC_DIRECTORIES = { 
    audio:  '/audios', 
    font:  '/fonts', 
    image:  '/images', 
    javascript: '/javascripts', 
    stylesheet: '/stylesheets', 
    video:  '/videos' 
    } 

Eine neue Rails 4 App hat dies in der config/environments/production.rb

# Do not fallback to assets pipeline if a precompiled asset is missed. 
    config.assets.compile = false 

scheint mit dem Verhalten übereinzustimmen, das Sie sehen.

+4

danke! Einige js/css-Dateien sind nicht vorkompiliert, da sie nicht mit der Datei application.js/css verknüpft werden können. Daher kann rails 4 assets precompile diese Dateien nicht finden. Sie können eine Datei zur Precompile-Dateiliste hinzufügen, wie dies '# config/environments/production.rb config.assets.precompile + = [Proc.new {| path | File.basename (Pfad) = ~ /^[^_].*\.\w+$/}] ' – comme

+4

Rails scheint einige sehr schlechte Standardwerte für die Asset-Pipeline zu haben. – jeffcook2150

-1

Möglicherweise liegt diese Datei in/vendor/assets/javascript anstelle von/app/assets/javascript. Der Vendor-Ordner ist für JavaScript-Bibliotheken und der App-Ordner für Ihren Code.

Eine bessere Lösung als ein Tag zu Ihrem Layout Hinzufügen des sass Compiler komprimieren ein Skript Bezug auf Ihre application.js und lassen Sie es zu Ihrem Haupt-JavaScript-Datei anhängen würde hinzufügen.

Wenn Sie nicht eine definitive Antwort erhalten haben, finden Sie unter: http://guides.rubyonrails.org/asset_pipeline.html#asset-organization

+0

Die Dateien in den Ordnern '/ vendor/assets/javascript /' und '/ app/assets/javascript /' werden in den Ordner 'public/assets/'kompiliert, und die generierte Datei' manifest.json' beschreibt die logischen Pfade um die Fingerabdruck-Dateien zu finden. Damit dies funktioniert, muss der von javascript_include_tag generierte Pfad jedoch immer noch auf "assets /" verweisen. – gregoltsov

4

Seien Sie sicher, dass Ihre Vermögenswerte in der Produktion vorzukompilieren mit dem folgenden Befehl:

RAILS_ENV=production bundle exec rake assets:precompile 

Die Rails-Handbuch auf der Asset-Pipeline geben Sie weitere Details: http://guides.rubyonrails.org/asset_pipeline.html#precompiling-assets

+0

Aber dies kompiliert nur die Assets in den Ordner "public/assets /" - es erklärt nicht, warum der Pfad falsch generiert wird. – gregoltsov

+0

Hast du den Pfad in deinem 'production.rb' geändert? Es würde aussehen wie 'config.assets.prefix ="/some_other_path "' http://guides.rubyonrails.org/asset_pipeline.html#changing-the-assets-path –

+0

Nein, tat ich nicht. Alle meine Assets in 'vendor /' werden korrekt in '/ assets' kompiliert und die Pfade sind korrekt.Es sind nur Javascripts in '/ app/assets'. Aus irgendeinem Grund wird der falsche Pfad von' javascript_include_tag' generiert. Und ja, ich habe sie zu 'precompile' hinzugefügt. Wirklich seltsames Verhalten ... – gregoltsov

1

ich habe eine neue Anwendung mit Rails 4 Einsatz auf Heroku mit:

. 210
<%= javascript_include_tag "application", "data-turbolinks-track" => true %> 

meine Javascript-Anwendung (Fingerabdruck) Js aus dem src genannt: assets/application.js

Ich denke, Ihr Problem von etwas in Ihr production.rb kommt, die Vermögenswerte von einem anderen Ort zu definieren.

Vielleicht können Sie Moderniz.js zu

config.assets.precompile = [‘Js, ' .css', '* .css.erb']

hinzufügen

in config/production.rb

Oder einfach modernisieren Skript in Ihre Anwendung.js

// = erfordern mordernizr

und den modernizr Skriptaufruf in Ihr Layout entfernen.

<%= javascript_include_tag "modernizr", "data-turbolinks-track" => true %> 

Können Sie überprüfen, woher Ihre application.js in Ihrer Produktionsumgebung geliefert wird?

12

Standardmäßig führt Rails nur application.js, application.css und alle Bilder, die es im Anlagenpfad findet, vor. Daher wird mordernizr in der Produktion nicht vorkompiliert und somit können die Javascript-Helfer die Datei nicht finden.

Um das Problem zu beheben, können Sie modernizr auf die precompile Liste durch Ändern der folgenden config in production.rb

config.assets.precompile += ['modernizr.js'] 

Weitere Informationen finden Sie the Rails Guides

Verwandte Themen