web-dev-qa-db-ger.com

Keine Route stimmt mit [GET]/Assets überein

Ich habe eine Rails-App, die ich in der Produktionsumgebung testen möchte. Ich lief Rails_ENV=production rake assets:precompile, der alle meine Vermögenswerte in/public/assets generierte. Das Problem ist, wenn ich meine App mit Rails_ENV=production Rails s thin starte, bekomme ich:

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

Diese Datei existiert zwar bei /public/assets/application-eff78fd67423795a7be3aa21512f0bd2.css

Irgendwelche Gedanken, warum ich diese RoutingError bekomme?

131
Kyle Decot

Im Produktionsmodus ist Rails nicht für die Bedienung statischer Assets verantwortlich. Daher erhalten Sie diesen Fehler. Thin macht es auch nicht, da es nur ein Wrapper um Rails ist.

Dies wird durch diese Einstellung in config/environments/production.rb in Ihrer Anwendung gesteuert:

config.serve_static_files = false

Oder in Rails 5:

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

Oder setzen Sie ENV['Rails_SERVE_STATIC_FILES'] auf true.

Sie können entweder true einstellen oder einen echten Server wie Apache oder Nginx verwenden, der die statischen Assets bereitstellt. Ich vermute, Pow kann es auch tun.


Wenn Sie sich bei Heroku befinden, empfehlen sie die Verwendung des Rails_12factor gem, der diese Einstellung standardmäßig aktiviert. Platziere den Edelstein in einer production Gruppe in deinem Gemfile, wie folgt:

group :production do
  gem 'Rails_12factor'
end
215
Ryan Bigg

Zusätzlich zu dem, was Ryan oben gesagt hat, beschreibt der Rails-Leitfaden für die Asset-Pipeline, wie Sie Apache oder Nginx einrichten, um die statischen Assets für Sie bereitzustellen.

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

Sie sollten Nginx oder Apache wirklich für statische Assets einrichten, da sie für diese Aufgabe viel besser optimiert sind als Mongrel/Thin/Unicorn.

12
bratsche

Gerade das gleiche Problem gelöst. In meinem Fall war Ryans Antwort nicht hilfreich. Bratsche zeigte auf die Rails Guides, leider funktionierte das auch nicht für mich. Die Ressource war jedoch hilfreich. Also nahm ich von dort die Nginx-Konfiguration und fügte die Direktive root hinzu, die auf das öffentliche Verzeichnis verweist. Ohne das geht es nicht.

   # serve static assets
   location ~ ^/assets/ {
     expires 1y;
     root  /path/to/my/cool_project/public;
     add_header Cache-Control public;

     add_header ETag "";
     break;
   }

Starten Sie Nginx neu und fertig.

6
valk

In der Tat mussten Sie keine Standardkonfigurationen ändern. Sie müssen nur die Asset-Dateierneut kompilieren.

öffentliche/Vermögenswerte entfernen

1. geteilte Vermögenswerte: clobber Rails_ENV = Produktion

vermögenswerte kompilieren

2.gleke-Werte: Rails_ENV = production vorkompilieren

3.neustart server, zB (nginx)

3
Albert.Qing

Rails 4.2 hat diese Zeile in den Dateien config/umwelts/staging.rb und production.rb hinzugefügt/geändert:

config.serve_static_files = ENV['Rails_SERVE_STATIC_FILES'].present?

Wenn Rails_SERVE_STATIC_FILES nicht festgelegt ist und Sie Service Assets von Ihrem Rails-Server sind (wie bei Unicorn), wird standardmäßig "false" festgelegt, und der RoutingError wird ausgelöst.

Dies ist eine einfache Lösung:

config.serve_static_files = true
2
Martin Sommer

versuchen Sie es mit dem folgenden Code:

konfig/Umgebungen/Produktion.rb

config.assets.compile = true

dann führen Sie den Befehl aus:

Rails_ENV=production rake assets:precompile

schieben Sie dann alle kompilierten Dateien und Manifestdateien auf den Server.

2
puneet18

In Rails 5 hat sich die config.serve_static_files-Option geändert. Jetzt müssen Sie dies tun 

config.public_file_server.enabled = true

vermögenswerte vor Ort bedienen.

2
Obromios

Wenn jemand mit der gleichen Fehlermeldung wie ich hierher kommt, haben mir folgende geholfen:

Rails assets:clobber assets:precompile Rails_ENV=test

dann:

ps axu | grep your-username

um spring server-Prozess und seine PID zu finden, töten Sie ihn über:

kill <spring-server-PID>
0
ToTenMilan

Ich benutze mina + puma + nginx , um meine Rails 5 - Anwendung einzusetzen, die ich bekommen habe

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

Überprüfen Sie config/umwelts/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 behandelt dies bereits , konfiguriert es entsprechend

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;
}

dinge werden gut funktionieren.

0
Feuda