J'ai une Rails 4 application avec
<%= javascript_include_tag "modernizr", "data-turbolinks-track" => true %>
dans la tête. En développement, le code HTML suivant est rendu et modernizr est chargé:
<script data-turbolinks-track="true" src="/assets/modernizr.js?body=1"></script>
En production, le HTML suivant est rendu, et modernizr n'est pas chargé (404 introuvable):
<script data-turbolinks-track="true" src="/javascripts/modernizr.js"></script>
En production, /assets/modernizr.js
est trouvé et consultable.
Le documentation Rails indique que le javascript_include_tag
devrait générer
<script data-turbolinks-track="true" src="/assets/modernizr.js?body=1"></script>
En production, mon stylesheet_link_tag
s sont très bien, un lien vers le /assets/
répertoire.
Pourquoi est-ce que javascript_include_tag
lien vers /javascripts
au lieu de /assets
en production, et comment puis-je y remédier?
L'une des instructions d'utilisation de AssetUrlHelper indique qu'il produira/javascripts/urls comme ce que vous voyez:
# asset_path "application", saisissez:: javascript # => /javascripts/application.js
(depuis asset_url_helper.rb ligne 117 - [ 1 ])
Ce code ne peut être atteint que si l'actif précompilé est manquant, il semblerait donc que votre compilation d'actifs ne fonctionne pas (mes déploiements échouent généralement lorsque cela se produit, donc peut-être que le vôtre ne se déclenche même pas).
Le même asset_url_helper.rb appelle le/javascripts/part 'extname' et utilise la carte suivante pour savoir comment générer le nom:
# Maps asset types to public directory.
ASSET_PUBLIC_DIRECTORIES = {
audio: '/audios',
font: '/fonts',
image: '/images',
javascript: '/javascripts',
stylesheet: '/stylesheets',
video: '/videos'
}
Une nouvelle application Rails 4 a cela dans le config/environnements/production.rb
# Do not fallback to assets pipeline if a precompiled asset is missed.
config.assets.compile = false
qui semble correspondre au comportement que vous voyez.
Par défaut, Rails précompile uniquement application.js
, application.css
et toutes les images qu'il trouve dans le chemin d'accès aux ressources. Par conséquent, en production, mordernizr ne sera pas précompilé et les assistants javascript ne pourront donc pas trouver le fichier.
Afin de résoudre le problème, vous pouvez ajouter modernizr à la liste de précompilation en modifiant la configuration suivante dans production.rb
config.assets.precompile += ['modernizr.js']
Pour plus d'informations, voir the Rails Guides
Veillez à précompiler vos actifs en production en exécutant cette commande:
Rails_ENV=production bundle exec rake assets:precompile
Le Rails Guide sur le pipeline d'actifs peut vous donner plus de détails: http://guides.rubyonrails.org/asset_pipeline.html#precompiling-assets
J'ai une nouvelle application utilisant Rails 4 déployée sur Heroku avec:
<%= javascript_include_tag "application", "data-turbolinks-track" => true %>
mon application javascript. (empreinte digitale) .js appelé depuis le src: assets/application.js
je pense que votre problème vient de quelque chose dans votre production.rb qui définit les actifs d'un autre emplacement.
Vous pouvez donc peut-être ajouter Moderniz.js à
config.assets.precompile = ['. js', '. css', '* .css.erb']
dans config/production.rb
Ou exigez simplement un script modernizr dans votre application.js
// = nécessite mordernizr
et supprimez l'appel de script modernizr dans votre mise en page.
<%= javascript_include_tag "modernizr", "data-turbolinks-track" => true %>
Pouvez-vous vérifier d'où votre application.js est servi dans votre environnement de production?