没有路线符合[GET] /资产


143

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

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

该文件确实存在,尽管位于/public/assets/application-eff78fd67423795a7be3aa21512f0bd2.css

关于为什么我要这个有RoutingError什么想法吗?

Answers:


230

在生产模式下,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)。我怀疑战俘也可能这样做。


如果您在Heroku上,他们建议您使用rails_12factorgem,默认情况下启用此设置。将宝石放入production您的组中Gemfile,如下所示:

group :production do
  gem 'rails_12factor'
end

5
有人知道在部署到heroku时是否可以解决上述问题?
凯尔·克莱格

明确的答案,非常感谢。我thin在开发计算机上使用生产环境进行测试时,已到达此页面。我正在编译资产,但是它application.css是空的,服务器日志给出了OP的错误。
veritas1 2013年

2
在Rails 4中它将是config.serve_static_filesconfig.serve_static_assets已被弃用,并且将在Rails的5删除
森皮

部署到RHEL发行版时,我还没有涉及默认的环境配置,只是在Rails v4.2.4中添加了rails_12factor gem,现在一切正常。非常感谢
Onur Kucukkece 2015年

1
@Onur:这意味着您的Rails应用程序将提供资产,而不是Web服务器。我根本不建议使用此配置,因为它会使Rails服务器变慢。
Ryan Bigg

12

除了上面Ryan所说的那样,Rails资产管道指南还介绍了如何设置Apache或Nginx为您提供静态资产。

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

您确实应该设置nginx或Apache来提供静态资产,因为与mongrel / thin / unicorn相比,静态资产对这项任务的优化要好得多。


7

刚刚解决了同样的问题。就我而言,瑞安的回答没有帮助。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

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

删除公共/资产

1.rake资产:clobber RAILS_ENV =生产

资产编制

2.rake资产:预编译RAILS_ENV =生产

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


@ SteveO7,显然,默认情况下,rails在开发人员模式下使用资产pipleline。
Albert.Qing 2016年

2

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

谢谢,这是最简单的选择。配置通常取决于服务器环境,并使其可以通过env变量进行配置非常好。
akostadinov

2

在Rails 5中,该config.serve_static_files选项已更改,因此现在您需要

config.public_file_server.enabled = true

在本地服务资产。


2

试试下面的代码:

config / environments / production.rb

config.assets.compile = true

然后运行命令:

RAILS_ENV=production rake assets:precompile

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


1

我使用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;
}

一切都会好起来的。


1

如果有人在测试环境中遇到与我相同的错误,这对我有帮助:

rails assets:clobber assets:precompile RAILS_ENV=test

然后:

ps axu | grep your-username

找到spring server进程及其PID,然后通过以下方法将其杀死:

kill <spring-server-PID>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.