2013-07-12 14 views
31

Mam aplikacji Rails 4 zjavascript_include_tag Szyny 4 generujący "/ javascripts /" zamiast "/ aktywa" w produkcji

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

w głowę. W rozwoju, po HTML wygenerowana i modernizr załadowano:

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

w produkcji, NASTĘPUJĄCE HTML wygenerowana i modernizr jest nie ładunkiem (404 nie znaleziono):

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

W produkcji znaleziono /assets/modernizr.js i można je przeglądać.

Rails documentation mówi, że javascript_include_tag powinien generować

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

W produkcji, moi stylesheet_link_tag s są w porządku, z linkami do katalogu /assets/.

Dlaczego javascript_include_tag łączy się z /javascripts zamiast z /assets w produkcji i jak mogę to naprawić?

+2

Czy uda Ci się znaleźć rozwiązanie tego ? Mam dokładnie ten sam problem, ale żadna z odpowiedzi tutaj nie pomoże. – gregoltsov

+2

w produkcji, powinieneś mieć odcisk palca, np. '/ Assets/light-0cd9377b97b67182b68c8023bd6c2fbe.css' – phoet

+1

Czy jest to czysta aplikacja Rails 4 lub uaktualnienie z wcześniejszej wersji Rails? –

Odpowiedz

21

Jedna z wypowiedzi serwera dla AssetUrlHelper wskazuje, że będzie produkować/javascripts/URL jak to, co widzisz:

# asset_path "wniosek", należy wpisać:: javascript # => /javascripts/application.js

(od linii asset_url_helper.rb 117 - [1])

Ten kod wygląda to może być osiągnięte tylko wtedy, gdy składnik aktywów prekompilowany brakuje więc wydaje się, że kompilacja atut nie działa (zazwyczaj moje wdrożeń kończy się niepowodzeniem, gdy tak się dzieje, więc może twój nie strzela nawet).

To samo asset_url_helper.rb nazywa/javascripts/część 'extname' i wykorzystuje następujące mapy, aby wiedzieć, jak wygenerować nazwę:

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

nowa aplikacja Rails 4 to w config/environments/production.rb

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

co wydaje się pasować do zachowania, które widzisz.

+4

dziękuję! Niektóre pliki js/css nie są prekompilowane, ponieważ nie mogą być skojarzone z plikiem application.js/css, więc prekompilacja zasobów 4 rails nie może znaleźć tych plików. Możesz dodać plik do prekompilowanej listy plików, ponieważ '# config/environments/production.rb config.assets.precompile + = [Proc.new {| ścieżka | File.basename (path) = ~ /^[^_].*\.\w+$/}] ' – comme

+4

Railsy mają bardzo złe ustawienia domyślne dla potoku zasobów. – jeffcook2150

-1

Może to być spowodowane tym, że plik ten musi znajdować się w/vendor/assets/javascript zamiast/app/assets/javascript. Folder Vendor przeznaczony jest dla bibliotek javascript, a folder App dla twojego kodu.

Lepszym rozwiązaniem niż dodanie znacznika do układu byłoby dodanie odwołania do skryptu do pliku application.js i zezwolenie kompilatorowi sass na kompresję i dołączenie go do głównego pliku javascript.

Jeśli nie uzyskać ostateczną odpowiedź, sprawdź: http://guides.rubyonrails.org/asset_pipeline.html#asset-organization

+0

Pliki w folderach '/ vendor/assets/javascript /' i '/ app/assets/javascript /' są kompilowane do folderu 'public/assets /', a wygenerowany plik 'manifest.json' opisuje ścieżki logiczne znaleźć pliki odcisków palców. Jednak aby to działało, ścieżka wygenerowana przez 'javascript_include_tag' nadal musi wskazywać na' assets/'. – gregoltsov

4

Koniecznie precompile swoje aktywa w produkcji uruchamiając polecenie:

RAILS_ENV=production bundle exec rake assets:precompile 

prowadnicami na rurociągu aktywów może dać Ci więcej szczegółów: http://guides.rubyonrails.org/asset_pipeline.html#precompiling-assets

+0

Ale to tylko kompiluje zasoby w folderze 'public/assets /' - nie wyjaśnia, dlaczego ścieżka jest generowana niepoprawnie. – gregoltsov

+0

Czy zmieniłeś ścieżkę w pliku 'production.rb'? Wyglądałoby na to, że 'config.assets.prefix ="/some_other_path "' http://guides.rubyonrails.org/asset_pipeline.html#changing-the-assets-path –

+0

Nie, nie zrobiłem. Wszystkie moje zasoby w 'vendor /' są poprawnie skompilowane do '/ assets', a ścieżki są poprawne.To po prostu javascripts w '/ app/assets' z jakiegoś powodu ma złą ścieżkę generowaną przez' javascript_include_tag'. I tak, dodałem je do 'prekompilacji'. Naprawdę dziwne zachowanie ... – gregoltsov

1

mam nową aplikację przy użyciu Rails 4 rozmieszczonych na Heroku z:

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

mój javascript aplikacji (fingerprint) js wywołana z src: aktywa/application.js

Myślę, że problem pochodzą z czegoś w swoim production.rb którzy określenia aktywów z innego miejsca.

Więc może można dodać Moderniz.js do

config.assets.precompile = [”js, ' .css', '* .css.erb']

w config/production.rb

Lub po prostu wymagają skryptu modernizr do swojej aplikacji.js

// = wymagać mordernizr

i usunąć wywołanie skryptu modernizr w swoim układzie.

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

Czy można sprawdzić, skąd plik application.js jest wyświetlany w środowisku produkcyjnym?

12

Domyślnie tylko Railsy prekompilują application.js, application.css i wszelkie obrazy znalezione w ścieżce aktywów. Dlatego w procesie produkcyjnym mordernizr nie zostanie wstępnie skompilowany, a zatem pomocnicy javascript nie będą mogli znaleźć pliku.

Aby rozwiązać ten problem, można dodać modernizr do listy prekompilacji modyfikując następujące config w production.rb

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

Aby uzyskać więcej informacji, zobacz the Rails Guides