I'm upgrading an application to use the asset pipeline.
I've got the css assets compiling into an application css file but they not being found when I run the application in production mode with
RAILS_ENV=production bundle exec rails s
and I visit any page I get the correct output from the database but no styling and the log shows:
ActionController::RoutingError (No route matches [GET] "/assets/default.scss-1a27c...f07c.css"):
Even though that file exists in public/assets
$ ls public/assets/def* public/assets/default.scss-1a27c...f07c.css public/assets/default.scss.css public/assets/default.scss-1a27c...f07c.css.gz public/assets/default.scss.css.gz
What do I need to change to get the server to find the asset file?
Same is happening for my other .css files. They get compiled into public/assets with finger prints but then are not found.
Page source is showing:
<link href="/assets/default.scss-1a27c...f07c.css" media="screen" rel="stylesheet" type="text/css" />
The rails (haml) source is = stylesheet_link_tag 'default.scss.css'
public.assets
curently includes has the following files.
$ ls public/assets/def* public/assets/default.scss-1a27c22229b7b522066181f27af4f07c.css public/assets/default.scss-1a27c22229b7b522066181f27af4f07c.css.gz public/assets/default.scss.css public/assets/default.scss.css.gz
application.rb has
$ cat config/application.rb require File.expand_path('../boot', __FILE__) # Pick the frameworks you want: require "active_record/railtie" require "action_controller/railtie" require "action_mailer/railtie" require "active_resource/railtie" require "sprockets/railtie" # require "rails/test_unit/railtie" if defined?(Bundler) # If you precompile assets before deploying to production, use this line Bundler.require(*Rails.groups(:assets => %w(development test))) # If you want your assets lazily compiled in production, use this line # Bundler.require(:default, :assets, Rails.env) end module Linker class Application < Rails::Application config.encoding = "utf-8" config.filter_parameters += [:password] config.assets.enabled = true config.assets.initialize_on_precompile = false # For Heroku config.assets.version = '1.0' end end
config/environments/production
has:
$ cat config/environments/production.rb Linker::Application.configure do config.consider_all_requests_local = false config.action_controller.perform_caching = true config.assets.precompile += ['default.scss.css','main.css', 'jquery-ui-1.8.22.custom.css'] config.serve_static_assets = false config.assets.compress = true config.assets.compile = false config.assets.digest = true config.log_level = :debug config.i18n.fallbacks = true config.active_support.deprecation = :notify end
This seems to be happening for all assets, e.g.
Started GET "/assets/default.scss-1a27c22229b7b522066181f27af4f07c.css" for 127.0.0.1 at 2014-02-23 10:24:47 -0500 ActionController::RoutingError (No route matches [GET] "/assets/default.scss-1a27c22229b7b522066181f27af4f07c.css"): Started GET "/assets/main-6864687b4114a1c316e444bd90f233ff.css" for 127.0.0.1 at 2014-02-23 10:24:47 -0500 ActionController::RoutingError (No route matches [GET] "/assets/main-6864687b4114a1c316e444bd90f233ff.css"): Started GET "/assets/jquery-ui-1.8.22.custom-24319b4b1218846a3fe22a0479ae98b4.css" for 127.0.0.1 at 2014-02-23 10:24:47 -0500 ActionController::RoutingError (No route matches [GET] "/assets/jquery-ui-1.8.22.custom-24319b4b1218846a3fe22a0479ae98b4.css"): Started GET "/assets/application-fc1d492d730f2a45581a40eac4607db8.js" for 127.0.0.1 at 2014-02-23 10:24:47 -0500 ActionController::RoutingError (No route matches [GET] "/assets/application-fc1d492d730f2a45581a40eac4607db8.js"): Started GET "/images/link.ico" for 127.0.0.1 at 2014-02-23 10:24:48 -0500 ActionController::RoutingError (No route matches [GET] "/images/link.ico"):
To compile your assets locally, run the assets:precompile task locally on your app. Make sure to use the production environment so that the production version of your assets are generated. A public/assets directory will be created. Inside this directory you'll find a manifest.
rails assets:precompile is the task that does the compilation (concatenation, minification, and preprocessing). When the task is run, Rails first looks at the files in the config.assets.precompile array. By default, this array includes application.js and application.css .
The asset pipeline provides a framework to concatenate and minify or compress JavaScript and CSS assets. It also adds the ability to write these assets in other languages such as CoffeeScript, Sass and ERB. Prior to Rails 3.1 these features were added through third-party Ruby libraries such as Jammit and Sprockets.
Rails by default doesn't serve assets under public
. See your production.rb
:
config.serve_static_assets = true
Change that to true and you're good to go. (Note: you don't want that to be true
in production, remember to change it back before deploying!)
See Configuring Rails Applications for details.
In rails 6, in the default production.rb
there should be a line
config.public_file_server.enabled = ENV['RAILS_SERVE_STATIC_FILES'].present?
So run your server with
RAILS_SERVE_STATIC_FILES=true rails server -e production
or set config.public_file_server.enabled=true
in production.rb
. See answers below for rails 4 and 5.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With