125 votes

Rails 4 : les actifs ne se chargent pas en production

J'essaie de mettre mon application en production et les chemins d'accès aux images et aux fichiers CSS ne fonctionnent pas.

Voici ce que je fais actuellement :

  • Les images se trouvent dans /app/assets/images/image.jpg
  • Les feuilles de style se trouvent dans /app/assets/stylesheets/style.css
  • Dans ma mise en page, je fais référence au fichier css comme ceci : <%= stylesheet_link_tag "styles", media: "all", "data-turbolinks-track" => true %>
  • Avant de redémarrer la licorne, j'exécute RAILS_ENV=production bundle exec rake assets:precompile et cela réussit et je vois les fichiers empreintes digitales dans le fichier public/assets répertoire.

Lorsque je navigue sur mon site, j'obtiens une erreur 404 non trouvée pour mysite.com/stylesheets/styles.css .

Qu'est-ce que je fais de mal ?

Mise à jour : Dans ma mise en page, cela ressemble à ceci :

<%= stylesheet_link_tag    "bootstrap.min", media: "all", "data-turbolinks-track" => true %>
<%= stylesheet_link_tag    "styles", media: "all", "data-turbolinks-track" => true %>
<%= javascript_include_tag "application", "data-turbolinks-track" => true %>

La source de génération est la suivante :

<link data-turbolinks-track="true" href="stackoverflow.com/stylesheets/bootstrap.min.css" media="all" rel="stylesheet" />
<link data-turbolinks-track="true" href="stackoverflow.com/stylesheets/styles.css" media="all" rel="stylesheet" />
<script data-turbolinks-track="true" src="/assets/application-0c647c942c6eff10ad92f1f2b0c64efe.js"></script>

On dirait que Rails ne recherche pas correctement les fichiers css compilés. Mais c'est très confus pourquoi il fonctionne correctement pour les javascripts (remarquez l'icône /assets/****.js chemin).

0voto

Brad Points 2576

Je peux me tromper mais ceux qui recommandent de changer

config.assets.compile = true

Le commentaire de cette ligne est le suivant : #Ne pas revenir au pipeline des actifs si un actif précompilé est manqué.

Cela suggère qu'en mettant cette valeur à true, vous ne corrigez pas le problème, mais le contournez et exécutez le pipeline à chaque fois. Cela doit certainement réduire les performances et aller à l'encontre de l'objectif du pipeline ?

J'ai eu la même erreur et c'était dû au fait que l'application s'exécutait dans un sous-dossier que rails ne connaissait pas.

Mon fichier css se trouvait donc dans home/subfolder/app/public/.... mais rails cherchait dans home/app/public/...

Essayez soit de déplacer votre application hors du sous-dossier, soit d'indiquer à rails qu'elle se trouve dans un sous-dossier.

0voto

location ~ ^/assets/ {
  expires 1y;
  add_header Cache-Control public;
  add_header ETag "";
}

Cela a réglé le problème pour moi en production. Mettez-le dans la configuration de nginx.

0voto

Bhavya Keniya Points 39

Nous avons également rencontré le même problème lorsque RAILS_ENV=production bundle exec rake assets:precompile a réussi mais les choses n'ont pas fonctionné comme prévu.
Nous avons constaté que la licorne était le principal coupable ici.

Comme dans votre cas, nous avions l'habitude de redémarrer la licorne après avoir compilé les actifs. Nous avons remarqué que lorsque la licorne est redémarrée, seuls ses processus ouvriers sont redémarrés et non le processus maître.
C'est la principale raison pour laquelle les actifs corrects ne sont pas servis.

Plus tard, après avoir compilé les actifs, nous avons arrêté et démarré unicorn afin que le processus maître de unicorn soit également redémarré et que les actifs corrects soient servis.
L'arrêt et le démarrage de la licorne entraînent un temps d'arrêt d'environ 10 secondes par rapport au redémarrage de la licorne. C'est la solution de contournement qui peut être utilisée, alors que la solution à long terme est de passer de la licorne à puma.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X