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?
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
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.
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.
In der Tat mussten Sie keine Standardkonfigurationen ändern. Sie müssen nur die Asset-Dateierneut kompilieren.
1. geteilte Vermögenswerte: clobber Rails_ENV = Produktion
2.gleke-Werte: Rails_ENV = production vorkompilieren
3.neustart server, zB (nginx)
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
versuchen Sie es mit dem folgenden Code:
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.
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.
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>
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.