没有路线匹配 /资产
我有一个Rails应用程序,我试图在生产环境中testing。 我跑RAILS_ENV=production rake assets:precompile
生成所有我的资产在/公共/资产。 问题是,当我启动我的应用程序RAILS_ENV=production rails s thin
/ RAILS_ENV=production rails s thin
我得到:
ActionController::RoutingError (No route matches [GET] "/assets/application-eff78fd67423795a7be3aa21512f0bd2.css"):
该文件确实存在,但在/public/assets/application-eff78fd67423795a7be3aa21512f0bd2.css
。
任何想法,为什么我得到这个RoutingError
?
在生产模式下,Rails将不负责提供静态资产。 因此,你得到这个错误。 薄也不会这样做,因为它只是一个围绕Rails的包装。
这是由您的应用程序中的config/environments/production.rb
中的设置控制的:
config.serve_static_files = false
或者在Rails 5中:
# config/environments/production.rb config.public_file_server.enabled = true
或者将ENV['RAILS_SERVE_STATIC_FILES']
为true。
您可以设置为true
或使用像Apache或Nginx这样的服务器来提供静态资源。 我怀疑鲍尔也可能做到这一点。
如果你在Heroku上,他们推荐使用rails_12factor
gem,默认启用这个设置。 将Gemfile
的production
组中,如下所示:
group :production do gem 'rails_12factor' end
除了Ryan上面所说的,Rails资产pipe道指南还介绍了如何设置Apache或nginx来为您提供静态资产。
http://guides.rubyonrails.org/asset_pipeline.html
你真的应该设置nginx或Apache来提供静态资产,因为它们比mongrel / thin / unicorn更适合这个任务。
刚刚解决了同样的问题。 在我的情况Ryan的答案是没有帮助的。 Bratsche指出Rails指南,不幸的是这也不适合我。 但是这个资源是有帮助的。 所以我从那里拿了Nginxconfiguration,并添加了root指令,指向公共目录。 没有这个,它不起作用。
# serve static assets location ~ ^/assets/ { expires 1y; root /path/to/my/cool_project/public; add_header Cache-Control public; add_header ETag ""; break; }
重新启动nginx,就是这样。
Rails 4.2在config / environments / staging.rb和production.rb文件中添加/更改了这一行:
config.serve_static_files = ENV['RAILS_SERVE_STATIC_FILES'].present?
如果没有设置RAILS_SERVE_STATIC_FILES,并且您是来自Rails服务器的服务资产(如使用Unicorn),那么它将默认为“false”,并发生RoutingError。
这是一个简单的解决方法:
config.serve_static_files = true
事实上,你不需要修改任何默认的configuration。 您只需重新编译资产文件 。
删除公共/资产
1.rake资产:clobber RAILS_ENV =生产
资产编纂
2.rake资产:预编译RAILS_ENV =生产
3.restart服务器,例如(nginx)
在rails 5中, config.serve_static_files
选项已经改变,所以现在你需要有
config.public_file_server.enabled = true
在当地服务资产。
尝试下面的代码:
configuration/环境/ production.rb
config.assets.compile = true
然后运行命令:
RAILS_ENV=production rake assets:precompile
然后将所有编译文件和清单文件推送到服务器。
我使用mina + puma + nginx来部署我的Rails 5应用程序
ActionController::RoutingError (No route matches [GET] "/assets/application-658cf2ab3ac93aa5cb41a762b52cf49d7184509c307922cd3fbb61b237a59c1a.css")
检查config / environments / 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已经处理好了 ,正确configuration
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; }
事情会正常工作。