web-dev-qa-db-fra.com

rails - actif application.css introuvable en mode production

Je mets à niveau une application pour utiliser le pipeline d'actifs.

J'ai les ressources css compilées dans un fichier css d'application mais elles ne sont pas trouvées lorsque j'exécute l'application en mode production avec

Rails_ENV=production bundle exec Rails s

et je visite n'importe quelle page, je reçois la sortie correcte de la base de données mais pas de style et le journal affiche:

ActionController::RoutingError (No route matches [GET] 
"/assets/default.scss-1a27c...f07c.css"):

Même si ce fichier existe dans public/assets

$ ls public/assets/def*
public/assets/default.scss-1a27c...f07c.css     public/assets/default.scss.css
public/assets/default.scss-1a27c...f07c.css.gz  public/assets/default.scss.css.gz

Que dois-je changer pour que le serveur trouve le fichier d'actif?

La même chose se produit pour mes autres fichiers .css. Ils sont compilés en public/actifs avec des empreintes digitales mais ne sont pas trouvés.

La source de la page affiche:

<link href="/assets/default.scss-1a27c...f07c.css" 
media="screen" rel="stylesheet" type="text/css" />

La source Rails (haml) est = stylesheet_link_tag 'default.scss.css'

public.assets comprend actuellement les fichiers suivants.

$ ls public/assets/def*
public/assets/default.scss-1a27c22229b7b522066181f27af4f07c.css
public/assets/default.scss-1a27c22229b7b522066181f27af4f07c.css.gz
public/assets/default.scss.css
public/assets/default.scss.css.gz

application.rb a

$ cat config/application.rb 
require File.expand_path('../boot', __FILE__)

# Pick the frameworks you want:
require "active_record/railtie"
require "action_controller/railtie"
require "action_mailer/railtie"
require "active_resource/railtie"
require "sprockets/railtie"
# require "Rails/test_unit/railtie"

if defined?(Bundler)
  # If you precompile assets before deploying to production, use this line
  Bundler.require(*Rails.groups(:assets => %w(development test)))
  # If you want your assets lazily compiled in production, use this line
  # Bundler.require(:default, :assets, Rails.env)
end

module Linker
  class Application < Rails::Application
    config.encoding = "utf-8"
    config.filter_parameters += [:password]
    config.assets.enabled = true
    config.assets.initialize_on_precompile = false # For Heroku
    config.assets.version = '1.0'
  end
end

config/environments/production a:

$ cat config/environments/production.rb 
Linker::Application.configure do
  config.consider_all_requests_local       = false
  config.action_controller.perform_caching = true
  config.assets.precompile += ['default.scss.css','main.css', 'jquery-ui-1.8.22.custom.css']
  config.serve_static_assets = false
  config.assets.compress = true
  config.assets.compile = false
  config.assets.digest = true
  config.log_level = :debug
  config.i18n.fallbacks = true
  config.active_support.deprecation = :notify
end

Cela semble se produire pour tous les actifs, par exemple.

Started GET "/assets/default.scss-1a27c22229b7b522066181f27af4f07c.css" for 127.0.0.1 at 2014-02-23 10:24:47 -0500
ActionController::RoutingError (No route matches [GET] "/assets/default.scss-1a27c22229b7b522066181f27af4f07c.css"):
Started GET "/assets/main-6864687b4114a1c316e444bd90f233ff.css" for 127.0.0.1 at 2014-02-23 10:24:47 -0500
ActionController::RoutingError (No route matches [GET] "/assets/main-6864687b4114a1c316e444bd90f233ff.css"):
Started GET "/assets/jquery-ui-1.8.22.custom-24319b4b1218846a3fe22a0479ae98b4.css" for 127.0.0.1 at 2014-02-23 10:24:47 -0500
ActionController::RoutingError (No route matches [GET] "/assets/jquery-ui-1.8.22.custom-24319b4b1218846a3fe22a0479ae98b4.css"):
Started GET "/assets/application-fc1d492d730f2a45581a40eac4607db8.js" for 127.0.0.1 at 2014-02-23 10:24:47 -0500
ActionController::RoutingError (No route matches [GET] "/assets/application-fc1d492d730f2a45581a40eac4607db8.js"):
Started GET "/images/link.ico" for 127.0.0.1 at 2014-02-23 10:24:48 -0500
ActionController::RoutingError (No route matches [GET] "/images/link.ico"):
27
Michael Durrant

Les rails par défaut ne servent pas les actifs sous public. Voir votre production.rb:

  config.serve_static_assets = true

Changez cela en vrai et vous êtes prêt à partir. (Remarque: vous ne voulez pas que ce soit true en production, n'oubliez pas de le modifier avant le déploiement!)

Voir Configuration de Rails Applications pour plus de détails.

Dans Rails 6 , dans la valeur par défaut production.rb il devrait y avoir une ligne

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

Alors lancez votre serveur avec

Rails_SERVE_STATIC_FILES=true Rails server -e production

ou définissez config.public_file_server.enabled=true dans production.rb. Voir les réponses ci-dessous pour Rails 4 et 5.

31
awendt

La solution Rails 5 est similaire à la solution Rails 4 donnée par Jules Copeland ci-dessus.

Dans votre pré-généré config/environments/production.rb fichier, il devrait y avoir une entrée qui ressemble à ceci:

# Disable serving static files from the `/public` folder by default since
# Apache or NGINX already handles this.
config.public_file_server.enabled = ENV['Rails_SERVE_STATIC_FILES'].present?

J'ai trouvé une explication décente pour ce paramètre dans le Configuring Rails Guide des applications at http://guides.rubyonrails.org :

config.public_file_server.enabled configure Rails pour servir les fichiers statiques à partir du répertoire public. Cette option est définie par défaut sur true, mais dans l'environnement de production, elle est définie sur false car le logiciel serveur (par exemple NGINX ou Apache) ) utilisé pour exécuter l'application doit plutôt servir des fichiers statiques. Si vous exécutez ou testez votre application en mode production à l'aide de WEBrick (il n'est pas recommandé d'utiliser WEBrick en production) définissez l'option sur true. Sinon, vous ne pourrez pas pour utiliser la mise en cache des pages et demander des fichiers qui existent dans le répertoire public.

Conclusion : En production, démarrer votre Rails serveur avec Rails_SERVE_STATIC_FILES=1 permettra à Rails de servir tous les fichiers du répertoire public/assets comme le ferait un serveur Web. Gardez à l'esprit que Rails est un serveur d'applications et ne le fera pas aussi efficacement qu'un serveur Web (par exemple NGINX, Apache, etc.). Pour les applications réelles, vous devriez avoir un serveur Web dédié assis devant Rails qui servira actifs statiques en eux-mêmes et ne dérange que Rails pour le contenu dynamique selon les besoins. Pour plus de détails, voir cet article par Justin Weiss sur les différences entre les serveurs Web et les serveurs d'applications.

10
Ben Amos

Dans Rails 4, vous pouvez les faire apparaître en production (fonctionnant localement), en passant une variable d'environnement:

Rails_SERVE_STATIC_FILES=true Rails server -e production

Cela devrait fonctionner tant que vous avez cette ligne dans /config/environments/production.rb:

config.serve_static_files = ENV ['Rails_SERVE_STATIC_FILES']. Présent?

9
Jules Copeland

Quand vous faites rake assets:precompile, vos actifs vont dans le répertoire public. Voyez si vous pouvez trouver ces fichiers dans public/assets/

Vous devriez voir quelque chose comme ceci:

I, [2014-02-23T20:06:21.853314 #26915]  INFO -- : Writing app_root/public/assets/application-ecd8636fc80ea2b712039c4abc365da9.css
4
Lenin Raj Rajasekaran