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

时间:2011-10-19 23:33:57

标签: ruby-on-rails ruby-on-rails-3 asset-pipeline

我有一个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

的任何想法

9 个答案:

答案 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)

尝试以下代码:

配置/环境/ production.rb

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>