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

10voto

user3802981 Points 81

Il y a 2 choses que vous devez accomplir pour servir les actifs en production :

  1. Précompilez les actifs.
  2. Servez les actifs sur le serveur au navigateur.

1) Afin de précompiler les actifs, vous avez plusieurs choix.

  • Vous pouvez exécuter rake assets:precompile sur votre machine locale, commettez-le dans le contrôle du code source (git), puis exécutez le programme de déploiement, par exemple capistrano. Ce n'est pas une bonne façon de livrer des ressources précompilées au SCM.

  • Vous pouvez écrire une tâche rake qui exécute RAILS_ENV=production rake assets:precompile sur les serveurs cibles chaque fois que vous déployez votre application Rails en production, avant de redémarrer le serveur.

Le code d'une tâche pour capistrano ressemblera à ceci :

on roles(:app) do
  if DEPLOY_ENV == 'production'
    execute("cd #{DEPLOY_TO_DIR}/current && RAILS_ENV=production rvm #{ruby_string} do rake assets:precompile")
  end
end

2) Maintenant que vous avez les actifs sur les serveurs de production, vous devez les servir au navigateur.

Là encore, vous avez plusieurs choix.

  • Activez le service de fichiers statiques de Rails dans config/environnements/production.rb

    config.serve_static_assets = true # old
    
    or
    
    config.serve_static_files = true # new

    Utiliser Rails pour servir des fichiers statiques va tuer les performances de votre application Rails.

  • Configurez nginx (ou Apache) pour servir les fichiers statiques.

    Par exemple, mon nginx qui a été configuré pour fonctionner avec Puma ressemble à ceci :

    location ~ ^/(assets|images|fonts)/(.*)$ {
        alias /var/www/foster_care/current/public/$1/$2;
        gzip on;
        expires max;
        add_header Cache-Control public;
    }

4voto

Frederick Cheung Points 38410

Rails 4 ne génère plus la version non empreinte de l'actif : stylesheets/style.css ne sera pas généré pour vous.

Si vous utilisez stylesheet_link_tag alors le lien correct vers votre feuille de style sera généré

En outre styles.css devrait être dans config.assets.precompile qui est la liste des choses qui sont précompilées

3voto

Jassa Mahal Points 49

Modifier la ligne de votre fichier Production.rb

config.assets.compile = false

sur

config.assets.compile = true

et ajoutez également

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

3voto

BKSpurgeon Points 11129

Ce que vous NE DEVEZ PAS faire :

Certains de mes collègues ci-dessus vous ont recommandé de le faire :

config.serve_static_assets = true  ## DON”T DO THIS!! 
config.public_file_server.enabled = true ## DON”T DO THIS!!

Le pipeline d'actifs ferroviaires dit de l'approche ci-dessus :

Ce mode utilise plus de mémoire, a des performances plus faibles que le mode par défaut et n'est pas recommandé. Voir ici : ( http://edgeguides.rubyonrails.org/asset_pipeline.html#live-compilation )

Ce que vous devriez faire :

Pré-compilez vos actifs.

RAILS_ENV=production rake assets:precompile

Vous pouvez probablement le faire avec une tâche de râteau.

2voto

Alex Ventura Points 1390

Je suis en train de courir Serveur Ubuntu 14.04 , Ruby 2.2.1 y Rails 4.2.4 J'ai suivi un déploiement turorial de DigitalOcean et tout s'est bien passé mais quand je vais dans le navigateur et que j'entre l'adresse IP de mon VPS, mon application est chargée mais sans styles et sans javascript.

L'application fonctionne avec Licorne y Nginx . Pour résoudre ce problème, je suis entré sur mon serveur en utilisant SSH avec mon utilisateur Déployeur et aller dans le chemin de mon application qui est "/home/deployer/apps/blog". et exécutez la commande suivante :

RAILS_ENV=production bin/rake assets:precompile

Ensuite, je redémarre le VPS et c'est tout ! Cela fonctionne pour moi !

J'espère que cela pourra être utile à quelqu'un d'autre !

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