web-dev-qa-db-fra.com

Rails 4: actifs non chargés en production

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

Voici ce que je fais actuellement:

  • Les éléments d’image résident dans /app/assets/images/image.jpg 
  • Les feuilles de style résident dans /app/assets/stylesheets/style.css
  • Dans ma mise en page, je référence le fichier css comme suit: <%= stylesheet_link_tag "styles", media: "all", "data-turbolinks-track" => true %>
  • Avant de redémarrer Unicorn, j’exécute Rails_ENV=production bundle exec rake assets:precompile et le test réussit. Les fichiers empreints de doigts se trouvent dans le répertoire public/assets.

Lorsque je navigue sur mon site, je reçois une erreur 404 non trouvée pour mysite.com/stylesheets/styles.css

Qu'est-ce que je fais 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="/stylesheets/bootstrap.min.css" media="all" rel="stylesheet" />
<link data-turbolinks-track="true" href="/stylesheets/styles.css" media="all" rel="stylesheet" />
<script data-turbolinks-track="true" src="/assets/application-0c647c942c6eff10ad92f1f2b0c64efe.js"></script>

On dirait que Rails ne cherche pas correctement les fichiers CSS compilés. Mais c'est très déroutant pourquoi il fonctionne correctement pour les javascripts (notez le chemin /assets/****.js).

107
emersonthis

Dans /config/environments/production.rb je devais ajouter ceci:

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

Le .js commençait déjà à être précompilé, mais je l’ai ajouté quand même. Les fichiers .css et .css.erb ne se produisent apparemment pas automatiquement. Le ^[^_] exclut les partiels de la compilation - c'est une expression rationnelle.

Il est un peu frustrant que les documents indiquent clairement que le pipeline d’actifs IS est activé par défaut mais ne précise pas le fait que cela ne s’applique qu’aux javascripts.

32
emersonthis

Dans Rails 4, vous devez apporter les modifications ci-dessous:

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

Cela fonctionne avec moi. utiliser la commande suivante pour pré-compiler les actifs

Rails_ENV=production bundle exec rake assets:precompile

Bonne chance!

100
Rameshwar Vyevhare

Je viens d'avoir le même problème et a 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

Le changer en true le fait fonctionner. Il semble que, par défaut, Rails s’attende à ce que vous ayez configuré votre serveur Web frontal pour gérer les demandes de fichiers hors du dossier public au lieu de les envoyer par proxy à l’application Rails. Peut-être que vous avez fait cela 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 la variable d'environnement Rails_SERVE_STATIC_FILES, car le paramètre par défaut est config.public_file_server.enabled = ENV['Rails_SERVE_STATIC_FILES'].present?.

76
davmac

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

Update (24 juin 2018): cette méthode crée une vulnérabilité 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.

22
Yanofsky

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 sur true. 

10
ytbryan

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

  1. Précompiler les actifs.
  2. Servir les actifs sur le serveur pour le navigateur.

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

  • Vous pouvez exécuter rake assets:precompile sur votre ordinateur local, le valider pour le contrôle de code source (git), puis exécuter le programme de déploiement, par exemple capistrano. Ce n'est pas un bon moyen de valider des actifs précompilés dans SCM.

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

Le code dans 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, vous avez les actifs sur les serveurs de production, vous devez les servir au navigateur.

Encore une fois, vous avez plusieurs choix.

  • Activer le fichier statique Rails servant dans config/environment/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 des fichiers statiques.

    Par exemple, mon nginx configuré pour fonctionner avec Puma se présente comme suit:

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

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

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

De plus, styles.css doit figurer dans config.assets.precompile, qui est la liste des éléments précompilés.

4
Frederick Cheung

changez votre ligne de fichier Production.rb

config.assets.compile = false

dans 

config.assets.compile = true

et aussi ajouter

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

J'utilise Ubuntu Server 14.04, Ruby 2.2.1 et Rails 4.2.4 J'ai suivi un déploiement turorial de DigitalOcean et tout s'est bien passé, mais quand je vais à le navigateur et entrez l'adresse IP de mon VPS, mon application est chargée mais sans styles ni javascript.

L'application fonctionne avec Unicorn et Nginx. Pour résoudre ce problème, je suis entré sur mon serveur avec SSH avec mon utilisateur 'deployer' et je me suis rendu sur le chemin de mon application, '/ home/deployer/apps/blog'. et lancez la commande suivante:

Rails_ENV=production bin/rake assets:precompile

Ensuite, je viens de redémarrer le VPS et le tour est joué! Cela fonctionne pour moi!

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

2
Alex Ventura

Si la précompilation est définie, vous n'avez PAS besoin

config.assets.compile = true

comme cela est de servir des actifs en direct.

Notre problème était que nous n'avions qu'une base secrète de développement définie dans config/secrets.yml

development:
    secret_key_base: '83d141eeb181032f4070ae7b1b27d9ff'

Besoin d'entrée pour l'environnement de production

2
xxjjnn

Ce que vous ne devriez 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 portefeuille d’actifs de Rails dit de l’approche ci-dessus: 

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

Ce que tu devrais faire:

1. Précompilez vos actifs.

Rails_ENV=production rake assets:precompile

2. Ajoutez ces fichiers à git.

git add –-all

3. Transférez les modifications dans votre branche principale et redéployez-les.

git Push Origin master

2
BKSpurgeon

Le matcher par défaut pour la compilation de fichiers comprend application.js, application.css et tous les fichiers non-JS/CSS (cela inclut automatiquement tous les actifs image) des dossiers app/assets, y compris vos gems:

Si vous avez d'autres manifestes ou des feuilles de style individuelles et des fichiers JavaScript à inclure, vous pouvez les ajouter au tableau de précompilation dans config/initializers/assets.rb:

Rails.application.config.assets.precompile += ['admin.js', 'admin.css', 'swfObject.js']

http://guides.rubyonrails.org/asset_pipeline.html#precompiling-assets

1
FreePender

Même nous avons rencontré le même problème où Rails_ENV=production bundle exec rake assets:precompile a réussi mais les choses ne se sont pas déroulées comme prévu.
Nous avons constaté que Licorne était le principal coupable ici. 

Comme dans votre cas, nous avions même l'habitude de redémarrer Unicorn après avoir compilé les actifs. Il a été remarqué que lorsque Unicorn est redémarré, seuls ses processus de travail sont redémarrés et non le processus principal.
C’est la raison principale pour laquelle les actifs corrects ne sont pas servis. 

Plus tard, après avoir compilé les actifs, nous avons arrêté Unicorn afin que le processus maître Unicorn soit également redémarré et que les actifs appropriés soient servis.
Arrêter et démarrer Unicorn entraîne environ 10 secondes d’indisponibilité par rapport au redémarrage de Unicorn. C’est la solution de contournement qui peut être utilisée lorsque la solution à long terme est de passer à Puma de Unicorn.

0
Bhavya Keniya

il n'est pas recommandé de laisser capistrano pré-compiler des actifs, car cela peut prendre du temps et souvent prendre du temps. essayez de faire la précompilation des ressources locales. 

D'abord, définissez-le dans config/application.rb config.assets.initialize_on_precompile = false , Puis exécutez local Rails_ENV=production bin/rake assets:precompile .__ et ajoutez ces ressources publiques/à git. 

et config/environnements/development.rb, modifiez le chemin de votre actif pour éviter d’utiliser des actifs précompilés:

config.assets.prefix = '/dev-assets'

Si vous avez un problème de connexion à la base de données, cela signifie que vous avez un initialiseur qui utilise la base de données. Une solution consiste à définir un nouvel environnement en dupliquant production.rb, par exemple production2 .rb, et dans database.yml, ajoutez production2 environment avec le paramètre development db. alors fais

Rails_ENV=production2 bin/rake assets:precompile

si vous rencontrez toujours des problèmes avec les actifs, par exemple ckeditor, ajoutez le fichier js dans config/initializers/assets.rb

Rails.application.config.assets.precompile += %w( ckeditor.js )

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

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

0

Je peux me tromper mais ceux qui recommandent de changer

config.assets.compile = true

Le commentaire sur cette ligne est le suivant: #Ne pas recourir au pipeline d’actifs si un actif précompilé est manquant.

Cela suggère qu'en définissant ce paramètre sur true, vous ne résolvez pas le problème, mais vous le contournez et exécutez le pipeline à chaque fois. Cela doit sûrement tuer votre performance et faire échec à l'objectif du pipeline?

J'ai eu cette même erreur et c'était dû à l'application s'exécutant dans un sous-dossier que Rails ne connaissait pas.

Donc, mon fichier css se trouvait dans home/sous-dossier/app/public/.... mais Rails cherchait dans home/app/public/...

essayez de déplacer votre application hors du sous-dossier ou d'indiquer à Rails qu'elle se trouve dans un sous-dossier.

0
Brad

Tout d’abord, vérifiez vos actifs, il est possible qu’il y ait une erreur de pré-compilation des actifs.

Pour pré-compiler des actifs en production ENV, exécutez cette commande:

Rails_ENV=production rake assets:precompile

Si cela indique une erreur, supprimez-le en premier, 

En cas d'erreur "Variable non définie", chargez ce fichier de variable avant de l'utiliser dans un autre fichier.

exemple:

@import "variables";
@import "style";

dans le fichier application.rb, séquence de précompilation des actifs

exemple:

config.assets.precompile += [ 'application.js', 'admin.js', 'admin/events.js', 'admin/gallery.js', 'frontendgallery.js']

config.assets.precompile += [ 'application.css', 'admin.css','admin/events.css', 'admin/gallery.css', 'frontendgallery.css']
0
Chitresh goyal