J'ai une application Rails que j'essaie de tester dans l'environnement de production. J'ai exécuté Rails_ENV=production rake assets:precompile
qui a généré tous mes actifs dans/public/assets. Le problème est que lorsque je lance mon application avec/Rails_ENV=production Rails s thin
, je reçois:
ActionController::RoutingError (No route matches [GET] "/assets/application-eff78fd67423795a7be3aa21512f0bd2.css"):
Ce fichier existe bien à /public/assets/application-eff78fd67423795a7be3aa21512f0bd2.css
.
Avez-vous une idée de la raison pour laquelle je reçois cette RoutingError
?
En mode de production, Rails ne sera pas responsable de la gestion des actifs statiques. Par conséquent, vous obtenez cette erreur. Thin ne le fera pas non plus, car c'est juste une enveloppe autour de Rails.
Ceci est contrôlé par ce paramètre dans config/environments/production.rb
dans votre application:
config.serve_static_files = false
Ou dans Rails 5:
# config/environments/production.rb
config.public_file_server.enabled = true
Ou définissez ENV['Rails_SERVE_STATIC_FILES']
sur true.
Vous pouvez soit définir cette variable true
ou utiliser un serveur réel comme Apache ou Nginx, qui servira les actifs statiques. Je soupçonne que Pow peut aussi le faire.
Si vous êtes sur Heroku, ils recommandent l’utilisation de la gemme Rails_12factor
qui active ce paramètre par défaut. Placez la gemme dans un groupe production
dans votre Gemfile
, comme ceci:
group :production do
gem 'Rails_12factor'
end
Ajoutant à ce que Ryan a dit ci-dessus, le guide de pipeline d’actifs Rails explique comment configurer Apache ou nginx pour servir les actifs statiques à votre place.
http://guides.rubyonrails.org/asset_pipeline.html
Vous devez vraiment configurer nginx ou Apache pour qu’ils servent des ressources statiques, car elles sont bien mieux optimisées pour cette tâche que méticuleux/mince/Licorne.
Juste résolu le même problème. Dans mon cas, la réponse de Ryan n'était pas utile. Bratsche a pointé les guides sur les rails, malheureusement, cela ne m'a pas non plus marché. Cependant, la ressource était utile. J'ai donc pris la configuration Nginx à partir de là et ajouté la directive root , pointant vers le répertoire public. Sans cela, ça ne marche pas.
# serve static assets
location ~ ^/assets/ {
expires 1y;
root /path/to/my/cool_project/public;
add_header Cache-Control public;
add_header ETag "";
break;
}
Redémarrez nginx et c'est tout.
En effet, vous n'avez pas besoin de modifier les configurations par défaut . Vous venez de recompiler le fichier d'actifs à nouveau.
1. actifs de freins: clobber Rails_ENV = production
Atouts 2.rake: précompiler Rails_ENV = production
Serveur 3.restart, par exemple (nginx)
Rails 4.2 a ajouté/modifié cette ligne dans vos fichiers config/environment/staging.rb et production.rb:
config.serve_static_files = ENV['Rails_SERVE_STATIC_FILES'].present?
Si Rails_SERVE_STATIC_FILES n'est pas défini et que vous êtes des actifs de service de votre serveur Rails (comme avec Unicorn), la valeur par défaut est "false" et l'erreur RoutingError se produira.
C'est une reparation facile:
config.serve_static_files = true
essayez le code ci-dessous:
config.assets.compile = true
puis lancez la commande:
Rails_ENV=production rake assets:precompile
ensuite, envoyez tous les fichiers compilés et le fichier manifeste au serveur.
Dans Rails 5, l’option config.serve_static_files
a été modifiée. Vous devez maintenant disposer de
config.public_file_server.enabled = true
pour servir des actifs localement.
Si quelqu'un arrive avec la même erreur que moi dans l'environnement de test, voici ce qui m'a aidé:
Rails assets:clobber assets:precompile Rails_ENV=test
puis:
ps axu | grep your-username
pour trouver le processus spring server
et son PID, puis le tuer via:
kill <spring-server-PID>
J'utilise mina + puma + nginx pour déployer mon application Rails 5, j'ai
ActionController::RoutingError (No route matches [GET] "/assets/application-658cf2ab3ac93aa5cb41a762b52cf49d7184509c307922cd3fbb61b237a59c1a.css")
vérifier config/environnements/production.rb
# 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?
NGINX gère déjà cela , le configure correctement
upstream puma {
server unix:///home/deploy/apps/appname/shared/tmp/sockets/appname-puma.sock;
}
server {
listen 80 default_server deferred;
# server_name example.com;
root /home/deploy/apps/appname/current/public;
access_log /home/deploy/apps/appname/current/log/nginx.access.log;
error_log /home/deploy/apps/appname/current/log/nginx.error.log info;
location ^~ /assets/ {
gzip_static on;
expires max;
add_header Cache-Control public;
}
try_files $uri/index.html $uri @puma;
location @puma {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_Host;
proxy_redirect off;
proxy_pass http://puma;
}
error_page 500 502 503 504 /500.html;
client_max_body_size 10M;
keepalive_timeout 10;
}
les choses vont bien.