Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

rails - application.css asset not found in production mode

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"): 
like image 773
Michael Durrant Avatar asked Feb 23 '14 14:02

Michael Durrant


People also ask

How do you Precompile rails assets?

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.

What is assets Precompile?

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 .

How does Rails asset pipeline work?

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.


1 Answers

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.

like image 69
awendt Avatar answered Sep 28 '22 00:09

awendt