Keine Route entspricht [GET] / Assets

143

Ich habe eine Rails-App, die ich in der Produktionsumgebung testen möchte. Ich habe ausgeführt, RAILS_ENV=production rake assets:precompilewodurch alle meine Assets in / public / Assets generiert wurden. Das Problem ist, dass beim Starten meiner App Folgendes RAILS_ENV=production rails s thinangezeigt wird:

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

Diese Datei existiert jedoch unter /public/assets/application-eff78fd67423795a7be3aa21512f0bd2.css.

Irgendwelche Gedanken darüber, warum ich das bekomme RoutingError?

Kyle Decot
quelle

Antworten:

230

Im Produktionsmodus ist Rails nicht für die Bereitstellung statischer Assets verantwortlich. Daher wird dieser Fehler angezeigt. Thin wird es auch nicht tun, da es nur ein Wrapper um Rails ist.

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

config.serve_static_files = false

Oder in Rails 5:

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

Oder ENV['RAILS_SERVE_STATIC_FILES']auf true setzen.

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


Wenn Sie auf Heroku sind, empfehlen sie die Verwendung des rails_12factorEdelsteins, der diese Einstellung standardmäßig aktiviert. Platzieren Sie den Edelstein in einer productionGruppe in Ihrem Gemfile, wie folgt:

group :production do
  gem 'rails_12factor'
end
Ryan Bigg
quelle
5
Weiß jemand, ob dies eine Lösung für das besagte Problem bei der Bereitstellung auf Heroku ist?
Kyle Clegg
Klare Antwort, vielen Dank. Ich bin auf diese Seite gelangt, als ich die Produktionsumgebung thinauf meinem Entwicklungscomputer getestet habe. Ich habe die Assets kompiliert, application.csswar aber leer und das Serverprotokoll gab einen Fehler des OP aus.
Veritas1
2
In Rails 4 wird es sein config.serve_static_files. config.serve_static_assetsist veraltet und wird in Rails 5 entfernt.
Sampi
Bei der Bereitstellung auf einer RHEL-Distribution habe ich die Standardumgebungskonfiguration nicht berührt, sondern nur das Juwel rails_12factor in Rails v4.2.4 hinzugefügt. Jetzt ist alles in Ordnung. Vielen Dank
Onur Kucukkece
1
@Onur: Dies bedeutet, dass Ihre Rails-Anwendung die Assets und nicht Ihren Webserver bedient. Ich empfehle diese Konfiguration überhaupt nicht, da dies Ihren Rails-Server verlangsamen kann.
Ryan Bigg
12

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

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

Sie sollten Nginx oder Apache wirklich so einrichten, dass statische Assets bereitgestellt werden, da diese für diese Aufgabe viel besser optimiert sind als Mischlinge / Dünne / Einhörner.

bratsche
quelle
7

Habe gerade das gleiche Problem gelöst. In meinem Fall war Ryans Antwort nicht hilfreich. Bratsche zeigte auf die Rails Guides, leider funktionierte das auch bei mir nicht. Die Ressource war jedoch hilfreich. Also nahm ich die Nginx-Konfiguration von dort und fügte die Root- Direktive hinzu, die auf das öffentliche Verzeichnis zeigte. 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.

valk
quelle
3

In der Tat mussten Sie keine Standardkonfigurationen ändern. Sie kompilieren die Assets-Datei einfach erneut .

Öffentlichkeit / Vermögenswerte entfernen

1.rake Assets: Clobber RAILS_ENV = Produktion

Vermögenswerte kompilieren

2.rake Assets: RAILS_ENV = Produktion vorkompilieren

3. Server neu starten, zB (nginx)

Albert.Qing
quelle
@ SteveO7 Offensichtlich verwenden Rails standardmäßig Assets Pipleline im Dev-Modus.
Albert.Qing
2

Rails 4.2 hat diese Zeile in Ihren Dateien config / environment / 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" verwendet, und der RoutingError tritt auf.

Dies ist eine einfache Lösung:

config.serve_static_files = true
Martin Sommer
quelle
Danke, das ist die einfachste Option. Die Konfiguration hängt normalerweise von der Serverumgebung ab und es ist hilfreich, sie mit einer env-Variablen konfigurierbar zu machen.
Akostadinov
2

In Schienen 5 hat sich die config.serve_static_filesOption geändert, sodass Sie sie jetzt haben müssen

config.public_file_server.enabled = true

Vermögenswerte vor Ort zu bedienen.

Obromios
quelle
2

Versuchen Sie den folgenden Code:

config / Umgebungen / Produktion.rb

config.assets.compile = true

Führen Sie dann den folgenden Befehl aus:

RAILS_ENV=production rake assets:precompile

Schieben Sie dann alle Kompilierungsdateien und Manifestdateien auf den Server.

puneet18
quelle
1

Ich verwende mina + puma + nginx , um meine Rails 5-Anwendung bereitzustellen

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

Überprüfen Sie config / environment / 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 kümmert sich bereits darum, konfigurieren Sie 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.

Feuda
quelle
1

Wenn jemand mit dem gleichen Fehler in der Testumgebung wie ich hierher kommt, hat mir Folgendes geholfen:

rails assets:clobber assets:precompile RAILS_ENV=test

dann:

ps axu | grep your-username

um den spring serverProzess und seine PID zu finden , töte ihn dann über:

kill <spring-server-PID>
ToTenMilan
quelle