没有路由匹配[ GET ]/资产

我有一个 Rails 应用程序,我试图在生产环境中进行测试。我运行的 RAILS_ENV=production rake assets:precompile产生了我所有的资产/公共/资产。问题是,当我启动我的应用程序 w/RAILS_ENV=production rails s thin时,我得到:

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

这个文件在 /public/assets/application-eff78fd67423795a7be3aa21512f0bd2.css中确实存在。

有什么想法,为什么我得到这个 RoutingError

86634 次浏览

在生产模式中,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,默认情况下启用这个设置。将宝石放置在 Gemfileproduction组中,像这样:

group :production do
gem 'rails_12factor'
end

Rails 资产管道指南还介绍了如何设置 Apache 或 nginx 来为您提供静态资产。

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

您确实应该设置 nginx 或 Apache 来服务静态资产,因为它们比 mongrel/thin/unicorn 更适合这个任务。

刚刚解决了同样的问题。对我来说,瑞安的回答毫无帮助。Bratsche 指向了 Rails Guides,不幸的是,这对我来说也不起作用。然而,资源是有帮助的。因此,我从那里获取了 Nginx 配置,并添加了 指令,指向 public 目录。没有这个就不行。

   # 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/environment/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

实际上,您不需要修改任何默认配置。 你只是 重新编译资产文件

撤销公共/资产

1. 耙子资产: 重锤 RAILS _ ENV = 生产

资产编制

2. rake 资产: 预编译 RAILS _ ENV = production

3. 重新启动服务器,例如(nginx)

在 Rails5中,config.serve_static_files选项已经更改,因此现在您需要

config.public_file_server.enabled = true

为本地线人服务。

我使用 Mina + 美洲狮 + Nginx来部署我的 Rails 5应用程序,我得到了

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

检查 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 已经处理了这个 ,正确配置它

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

一切都会好起来的。

尝试以下代码:

Config/environment/production.rb

config.assets.compile = true

然后运行命令:

RAILS_ENV=production rake assets:precompile

然后将所有编译文件和清单文件推送到服务器。

如果有人在测试环境中出现了与我相同的错误,下面是帮助我的方法:

rails assets:clobber assets:precompile RAILS_ENV=test

然后:

ps axu | grep your-username

找到 spring server进程和他的 PID,然后杀死它通过:

kill <spring-server-PID>