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).

107voto

Dans les rails 4, vous devez effectuer les changements ci-dessous :

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

Cela fonctionne pour moi. Utilisez la commande suivante pour précompiler les actifs.

RAILS_ENV=production bundle exec rake assets:precompile

Bonne chance !

89voto

davmac Points 4317

Je viens de rencontrer le même problème et j'ai trouvé ce paramètre dans config/environnements/production.rb :

# Rails 4:
config.serve_static_assets = false

# Or for Rails 5:
config.public_file_server.enabled = false

En le changeant en true Je l'ai fait fonctionner. Il semble que, par défaut, Rails s'attende à ce que vous ayez configuré votre serveur Web frontal pour qu'il traite les demandes de fichiers hors du dossier public au lieu de les envoyer par proxy à l'application Rails. Peut-être l'avez-vous fait pour vos fichiers javascript mais pas pour vos feuilles de style CSS ?

( Voir la documentation de Rails 5 ). Comme indiqué dans les commentaires, avec Rails 5, vous pouvez simplement définir le paramètre RAILS_SERVE_STATIC_FILES puisque le paramètre par défaut est config.public_file_server.enabled = ENV['RAILS_SERVE_STATIC_FILES'].present? .

33voto

SDP Points 5567

Sur /config/environments/production.rb Je devais ajouter ceci :

Rails.application.config.assets.precompile += %w( *.js ^[^_]*.css *.css.erb )

Le .js était déjà précompilé, mais je l'ai quand même ajouté. Les .css et .css.erb ne se font apparemment pas automatiquement. Le site ^[^_] exclut les partiels d'être compilés -- c'est une regexp.

Il est un peu frustrant que la documentation indique clairement que le pipeline d'actifs EST activé par défaut mais ne précise pas que cela ne s'applique qu'aux javascripts.

23voto

Yanofsky Points 857

J'ai pu résoudre ce problème en changeant : config.assets.compile = false à
config.assets.compile = true en /config/environments/production.rb

Mise à jour (24 juin 2018) : Cette méthode crée une faille de sécurité si la version de Sprockets que vous utilisez est inférieure à 2.12.5, 3.7.2, ou 4.0.0.beta8

17voto

ytbryan Points 186

Pour Rails 5, vous devez activer le code de configuration suivant :

config.public_file_server.enabled = true

Par défaut, Rails 5 est livré avec cette ligne de configuration :

config.public_file_server.enabled = ENV['RAILS_SERVE_STATIC_FILES'].present?

Par conséquent, vous devrez définir la variable d'environnement RAILS_SERVE_STATIC_FILES à vrai.

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