Aucun itinéraire ne correspond à [GET] / actifs

143

J'ai une application Rails que j'essaie de tester dans l'environnement de production. J'ai exécuté RAILS_ENV=production rake assets:precompilece 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:

ActionController::RoutingError (No route matches [GET] "/assets/application-eff78fd67423795a7be3aa21512f0bd2.css"):

Ce fichier existe cependant à /public/assets/application-eff78fd67423795a7be3aa21512f0bd2.css .

Des pensées sur pourquoi je reçois ça RoutingError?

Kyle Decot
la source

Réponses:

230

En mode production, Rails ne sera pas responsable de la diffusion des actifs statiques. Par conséquent, vous obtenez cette erreur. Thin ne le fera pas non plus, car ce n'est qu'une enveloppe autour des rails.

Ceci est contrôlé par ce paramètre config/environments/production.rbdans votre application:

config.serve_static_files = false

Ou dans Rails 5:

# config/environments/production.rb
config.public_file_server.enabled = true

Ou mis ENV['RAILS_SERVE_STATIC_FILES']à vrai.

Vous pouvez soit définir cela, truesoit utiliser un vrai serveur 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 rails_12factorgemme qui active ce paramètre par défaut. Placez la gemme dans un productiongroupe dans votre Gemfile, comme ceci:

group :production do
  gem 'rails_12factor'
end
Ryan Bigg
la source
5
Quelqu'un sait-il si c'est une solution au problème lors du déploiement sur heroku?
Kyle Clegg
Réponse claire, merci beaucoup. Je suis arrivé à cette page alors que je testais l'environnement de production thinsur ma machine de développement. Je compilais les actifs mais j'étais application.cssvide et le journal du serveur a donné une erreur de l'OP.
veritas1
2
Dans Rails 4, ce sera le cas config.serve_static_files. config.serve_static_assetsest obsolète et sera supprimé dans Rails 5.
sampi
En déployant sur une distribution RHEL, je n'ai pas touché à la configuration de l'environnement par défaut, je viens d'ajouter le gem rails_12factor dans Rails v4.2.4, maintenant tout va bien. Merci beaucoup
Onur Kucukkece
1
@Onur: Cela signifie que votre application Rails servira les actifs, plutôt que votre serveur Web. Je ne recommande pas du tout cette configuration car elle peut ralentir votre serveur Rails.
Ryan Bigg
12

En plus de ce que Ryan a dit ci-dessus, le guide du pipeline d'actifs Rails décrit comment configurer Apache ou nginx pour servir les actifs statiques à votre place.

http://guides.rubyonrails.org/asset_pipeline.html

Vous devriez vraiment configurer nginx ou Apache pour servir les actifs statiques, car ils sont bien mieux optimisés pour cette tâche que mongrel / thin / unicorn.

bratsche
la source
7

Juste résolu le même problème. Dans mon cas, la réponse de Ryan n'a pas été utile. Bratsche a souligné les guides de rails, malheureusement cela n'a pas fonctionné pour moi aussi. Cependant, la ressource a été utile. J'ai donc pris la configuration Nginx à partir de là et ajouté la directive racine , pointant vers le répertoire public. Sans cela, cela ne fonctionne 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.

valk
la source
3

En effet, vous n'avez pas eu besoin de modifier les configurations par défaut. Vous venez de recompiler à nouveau le fichier de ressources .

supprimer public / actifs

1.rake actifs: clobber RAILS_ENV = production

compilation d'actifs

2. actifs de freinage: précompile RAILS_ENV = production

3. redémarrer le serveur, par exemple (nginx)

Albert.Qing
la source
@ SteveO7, évidemment, les rails utilisent les actifs pipleline en mode dev par défaut.
Albert.Qing
2

Rails 4.2 a ajouté / modifié cette ligne dans vos fichiers config / environnements / 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), alors il sera par défaut sur "false" et l'erreur RoutingError se produira.

C'est une reparation facile:

config.serve_static_files = true
Martin Sommer
la source
Merci, c'est l'option la plus simple. La configuration dépend généralement de l'environnement du serveur et la rendre configurable avec une variable d'environnement est bien.
akostadinov
2

Dans les rails 5, l' config.serve_static_filesoption a changé, donc maintenant vous devez avoir

config.public_file_server.enabled = true

pour servir les actifs localement.

Obromios
la source
2

essayez ci-dessous le code:

config / environnements / production.rb

config.assets.compile = true

puis exécutez la commande:

RAILS_ENV=production rake assets:precompile

puis envoyez tous les fichiers de compilation et le fichier manifeste au serveur.

puneet18
la source
1

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 , configurez-le 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 fonctionneront bien.

Feuda
la source
1

Si quelqu'un arrive ici avec la même erreur dans l'environnement de test que moi, voici ce qui m'a aidé:

rails assets:clobber assets:precompile RAILS_ENV=test

puis:

ps axu | grep your-username

trouver spring server processus et son PID puis le tuer via:

kill <spring-server-PID>
ToTenMilan
la source