没有路由匹配 [GET] /assets

发布于 2024-12-11 01:50:53 字数 431 浏览 1 评论 0原文

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

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

此文件确实存在于 /public/assets/application-eff78fd67423795a7be3aa21512f0bd2.css

关于为什么我收到此 RoutingError 有什么想法吗?

I have a Rails app that I'm trying to test in the production environment. I ran RAILS_ENV=production rake assets:precompile which generated all of my assets in /public/assets. The problem is that when I start my app w/ RAILS_ENV=production rails s thin I get:

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

This file does exist though at /public/assets/application-eff78fd67423795a7be3aa21512f0bd2.css.

Any thoughts as to why I'm getting this RoutingError?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(9

白芷 2024-12-18 01:50:53

在生产模式下,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 放入 Gemfile 中的 product 组中,如下所示:

group :production do
  gem 'rails_12factor'
end

In production mode, Rails will not be responsible for serving static assets. Therefore, you are getting this error. Thin won't do it either, since it's just a wrapper around Rails.

This is controlled by this setting in config/environments/production.rb in your application:

config.serve_static_files = false

Or in Rails 5:

# config/environments/production.rb
config.public_file_server.enabled = true

Or set ENV['RAILS_SERVE_STATIC_FILES'] to true.

You can either set to that true or use a real server like Apache or Nginx which will serve the static assets. I suspect Pow may also do it.


If you're on Heroku, they recommend the use of the rails_12factor gem which enables this setting by default. Place the gem into a production group in your Gemfile, like this:

group :production do
  gem 'rails_12factor'
end
因为看清所以看轻 2024-12-18 01:50:53

除了 Ryan 上面所说的之外,Rails 资产管道指南还描述了如何设置 Apache 或 nginx 来为您提供静态资产。

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

您确实应该设置 nginx 或 Apache 来提供静态资产,如下所示与 mongrel/thin/unicorn 相比,它们针对此任务进行了更好的优化。

Adding to what Ryan said above, the Rails asset pipeline guide describes how to setup Apache or nginx to serve the static assets for you.

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

You really should setup nginx or Apache to serve static assets, as they're much better optimized for this task than mongrel/thin/unicorn.

下壹個目標 2024-12-18 01:50:53

刚刚解决了同样的问题。就我而言,瑞安的回答没有帮助。 Bratsche 指出了 Rails Guides,不幸的是这对我来说也不起作用。不过,该资源很有帮助。所以我从那里获取了 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,就可以了。

Just solved the same problem. In my case Ryan's answer was not helpful. Bratsche pointed to the Rails Guides, unfortunately this didn't work for me too. However the resource was helpful. So I took Nginx configuration from there and added the root directive, pointing to the public directory. Without this it doesn't work.

   # serve static assets
   location ~ ^/assets/ {
     expires 1y;
     root  /path/to/my/cool_project/public;
     add_header Cache-Control public;

     add_header ETag "";
     break;
   }

Restart nginx, and that's it.

遗弃M 2024-12-18 01:50:53

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

config.public_file_server.enabled = true

本地提供资源。

In rails 5, the config.serve_static_files option has changed, so now you need to have

config.public_file_server.enabled = true

to serve assets locally.

平定天下 2024-12-18 01:50:53

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

删除公共/资产

1.rake资产:clobber RAILS_ENV=生产

资源编译

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

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

Indeed you didn't need to modify any default configs.
You just recompile assets file again.

remove public/assets

1.rake assets:clobber RAILS_ENV=production

assets compile

2.rake assets:precompile RAILS_ENV=production

3.restart server,eg(nginx)

半衾梦 2024-12-18 01:50:53

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”,就会出现路由错误。

这是一个简单的修复:

config.serve_static_files = true

Rails 4.2 has added/changed this line in your config/environments/ staging.rb and production.rb files:

config.serve_static_files = ENV['RAILS_SERVE_STATIC_FILES'].present?

If RAILS_SERVE_STATIC_FILES is not set, and you are service assets from your Rails server (like with Unicorn), then it will default to "false", and the RoutingError will occur.

This is an easy fix:

config.serve_static_files = true
嗼ふ静 2024-12-18 01:50:53

尝试下面的代码:

config/environments/development.rb

config.assets.compile = true

然后运行命令:

RAILS_ENV=production rake assets:precompile

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

try below code:

config/environments/production.rb

config.assets.compile = true

then run command:

RAILS_ENV=production rake assets:precompile

then push all compiles files and manifest file to server.

鹤仙姿 2024-12-18 01:50:53

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

它就可以正常工作。

I use mina+puma+nginx to deploy my Rails 5 application, I got

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

check 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 already handles this, config it corretcly

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

things will work fine.

仅此而已 2024-12-18 01:50:53

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

rails assets:clobber assets:precompile RAILS_ENV=test

然后:

ps axu | grep your-username

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

kill <spring-server-PID>

If somebody get here with the same error in the test environment as I do, here's what helped me:

rails assets:clobber assets:precompile RAILS_ENV=test

then:

ps axu | grep your-username

to find spring server process and his PID then kill it via:

kill <spring-server-PID>
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文