我有一个Rails应用程序,我正在尝试在生产环境中进行测试。我运行了RAILS_ENV=production rake assets:precompile
,它在/ public / assets中生成了我的所有资产。问题是,当我启动我的应用程序w / RAILS_ENV=production rails s thin
时,我得到:
ActionController::RoutingError (No route matches [GET] "/assets/application-eff78fd67423795a7be3aa21512f0bd2.css"):
此文件确实存在于/public/assets/application-eff78fd67423795a7be3aa21512f0bd2.css
。
为什么我会收到RoutingError
?
答案 0 :(得分:219)
在生产模式下,Rails不负责提供静态资产。因此,您收到此错误。 Thin也不会这样做,因为它只是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等真实服务器来提供静态资产。我怀疑Pow也可以这样做。
如果您使用Heroku,他们建议使用rails_12factor
gem,默认启用此设置。将gem放入production
中的Gemfile
组,如下所示:
group :production do
gem 'rails_12factor'
end
答案 1 :(得分:12)
除了上面提到的Ryan之外,Rails资产管道指南还介绍了如何设置Apache或nginx来为您提供静态资产。
http://guides.rubyonrails.org/asset_pipeline.html
你真的应该设置nginx或Apache来提供静态资产,因为它们比mongrel / thin / unicorn更适合这项任务。
答案 2 :(得分:6)
刚刚解决了同样的问题。在我的情况下,瑞恩的回答没有帮助。 Bratsche指出了Rails指南,遗憾的是这对我也不起作用。但是资源很有帮助。所以我从那里获取了Nginx配置并添加了 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,就是这样。
答案 3 :(得分:3)
事实上,您并不需要修改任何默认配置。 您只需 重新编译资源文件 。
1.rake assets:clobber RAILS_ENV = production
2.rake assets:预编译RAILS_ENV =生产
3.restart服务器,例如(nginx)
答案 4 :(得分:2)
Rails 4.2在config / environments / staging.rb和production.rb文件中添加/更改了这一行:
if
如果未设置RAILS_SERVE_STATIC_FILES,并且您是来自Rails服务器的服务资产(与Unicorn一样),则它将默认为“false”,并且将发生RoutingError。
这是一个简单的解决方法:
config.serve_static_files = ENV['RAILS_SERVE_STATIC_FILES'].present?
答案 5 :(得分:2)
在rails 5中,<select name="selector">
<option value="1">Option 1</option>
<option value="2">Option 2</option>
<option value="3">Option 3</option>
<option disabled><hr></option>
<option value="4">Option 4</option>
<option value="5">Option 5</option>
<option value="6">Option 6</option>
</select>
选项已更改,因此现在您需要
config.serve_static_files
在本地提供资产。
答案 6 :(得分:2)
尝试以下代码:
config.assets.compile = true
然后运行命令:
RAILS_ENV=production rake assets:precompile
然后将所有编译文件和清单文件推送到服务器。
答案 7 :(得分:0)
我使用 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已经处理了这个,对其进行了相应的配置
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;
}
事情会好起来的。
答案 8 :(得分:0)
如果有人像我一样在测试环境中遇到同样的错误,那么这对我有什么帮助:
rails assets:clobber assets:precompile RAILS_ENV=test
然后:
ps axu | grep your-username
找到spring server
进程,然后通过以下方法将其终止:
kill <spring-server-PID>