Reputation: 20815
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
?
Upvotes: 152
Views: 90223
Reputation: 640
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>
Upvotes: 1
Reputation: 2365
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.
Upvotes: 1
Reputation: 4427
try below code:
config.assets.compile = true
then run command:
RAILS_ENV=production rake assets:precompile
then push all compiles files and manifest file to server.
Upvotes: 1
Reputation: 107728
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
Upvotes: 246
Reputation: 16373
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.
Upvotes: 4
Reputation: 4615
Indeed you didn't need to modify any default configs. You just recompile assets file again.
1.rake assets:clobber RAILS_ENV=production
2.rake assets:precompile RAILS_ENV=production
3.restart server,eg(nginx)
Upvotes: 3
Reputation: 556
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
Upvotes: 2
Reputation: 9874
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.
Upvotes: 8
Reputation: 2674
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.
Upvotes: 12