web-dev-qa-db-fra.com

javascript_include_tag Rails 4 générant "/ javascripts /" au lieu de "/ assets" en production

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_tags 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?

32
Stuart

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.

21
mobileAgent

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

12
patkoperwas

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

4
Ross Allen

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?

1
rbinsztock