Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

files produced by asset:precompile don't match urls generated by stylesheet_link_tag (missing digest) in minimal rails 4 site

I'm using Ruby 2.0.0-p247 and Rails 4.0.0

If I make a minimal Rails 4 site like this:

rails new minimal
cd minimal
rails generate controller home index
tee config/routes.rb <<EOF
Minimal::Application.routes.draw do
  root 'home#index'
end
EOF

Then precompile the assets with

rake assets:precompile

It generates assets like:

I, [2013-09-04T17:05:36.992951 #3549]  INFO -- : Writing /WORKINGDIR/minimal/public/assets/application-723d1be6cc741a3aabb1cec24276d681.js
I, [2013-09-04T17:05:37.052303 #3549]  INFO -- : Writing /WORKINGDIR/minimal/public/assets/application-f1a14051f17824976271b9c0460232f0.css

But if I start the server in production mode, with

RAILS_ENV=production rails s

The generated URLs in the HTML don't point at the precompiled files:

<link data-turbolinks-track="true" href="/stylesheets/application.css" media="all" rel="stylesheet" />
<script data-turbolinks-track="true" src="/javascripts/application.js"></script>

I would expect, rather:

<link data-turbolinks-track="true" href="assets/application-f1a14051f17824976271b9c0460232f0.css" media="all" rel="stylesheet" />
<script data-turbolinks-track="true" src="/assets/application-723d1be6cc741a3aabb1cec24276d681.js"></script>

The default config/environments/production.rb settings say to use digests:

config.assets.digest = true

But it seems to be selectively ignored?

Am I missing something?

UPDATE:

I just tested this in Rails 4.2.3 and this appears to be fixed, however we need to hand a few more environment variables into the rails s command to start in production mode:

SECRET_KEY_BASE=$(rake secret) RAILS_SERVE_STATIC_FILES=true RAILS_ENV=production rails s
like image 915
pix Avatar asked Sep 04 '13 08:09

pix


1 Answers

While I was writing up this question I came across this blog post which suggests it is a bug.

http://railsblog.kieser.net/2013/08/rails4-phusion-passenger-asset-pipeline.html

Of the various suggestions, just setting the compilation fallback true...

config.assets.compile = true

seems to be sufficient to kick Rails in to generating appropriately digested URLs:

<link data-turbolinks-track="true" href="/assets/application-f1a14051f17824976271b9c0460232f0.css" media="all" rel="stylesheet" />
<script data-turbolinks-track="true" src="/assets/application-723d1be6cc741a3aabb1cec24276d681.js"></script>

The other suggestion, explicitly setting RAILS_ENV and RAILS_GROUPS seemed to produce different digest strings on the precompiled files, but they always seem to match up with the generated HTML regardless.

like image 176
pix Avatar answered Oct 30 '22 05:10

pix