没有路线匹配 /资产

我有一个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,默认启用这个设置。 将Gemfileproduction组中,如下所示:

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

事情会正常工作。