web-dev-qa-db-fra.com

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

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?

131
Kyle Decot

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
215
Ryan Bigg

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.

12
bratsche

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.

6
valk

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

supprimer public/assets

1. actifs de freins: clobber Rails_ENV = production

actifs compiler

Atouts 2.rake: précompiler Rails_ENV = production

Serveur 3.restart, par exemple (nginx)

3
Albert.Qing

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
2
Martin Sommer

essayez le code ci-dessous:

config/environnements/production.rb

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.

2
puneet18

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.

2
Obromios

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>
0
ToTenMilan

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.

0
Feuda