sprockets-rails icon indicating copy to clipboard operation
sprockets-rails copied to clipboard

Assets with index files not allowed everywhere?

Open LeEnno opened this issue 9 years ago • 4 comments

I'm using sprockets with its ability to use index files to organize assets. So with the following file structure under app/assets/stylesheets/foo/:

  • index.css.scss
  • bar.css.scss
  • baz.css.scss

app/assets/stylesheets/foo/index.css.scss looks like this:

/*
 *= require some_lib
 *= require some_other_lib
 *= require_tree .
 *= require_self
 */

// alotta styles
// ...

My config/initializers/asset.rb says:

Rails.Application.config.assets.precompile << 'foo.css'

So now on to the actual issue: in Rails 3.2.x this used to compile to

public/assets/foo.css

In Rails 4.2.x with sprockets-rails 2.3.3 it compiles to

public/assets/foo/index.css

This means that all my references a la <%= stylesheet_link_tag 'foo' %> are throwing errors like

Asset filtered out and will not be served: add `Rails.application.config.assets.precompile += %w( foo/index.css )` to `config/initializers/assets.rb` and restart your server

Was this change intentional? If so, why is there a possibility to use sprockets with index files at all, if you can't actually reference them via helpers like stylesheet_link_tag etc?

Additionally this leads to localhost:3000/assets/foo.css working in development, but not in production.

So: is this a bug or desired behavior?

Regards, Enno

LeEnno avatar Nov 23 '15 13:11 LeEnno

Could you check with sprockets-rails master and sprockets 3?

rafaelfranca avatar Nov 23 '15 17:11 rafaelfranca

Trying with sprockets-rails master (and sprockets 3.4.0) gives following behavior:

<%= stylesheet_link_tag 'foo' %> will tell me to place Rails.application.config.assets.precompile += %w( foo.css ) in my initializer. Unfortunately I already did this, but sprockets doesn't seem to recognize.

Additional info:

  • <%= stylesheet_link_tag 'foo/index' %> works fine, although foo/index.css is not in precompile array (foo.css still is)
  • precompiling still generates foo/index-#{digest}.css instead of foo-#{digest}.css

So it seems like adding foo.css to the precompile array translates to foo/index.css somewhere in the process, which I think is even weirder. Before (v2.3.3) it was just that foo.css wasn't an option, you were forced to use foo/index.css everywhere (in view helper and precompile array). Now (v3.0.0.beta3) both foo.css or foo/index.css can be used in precompile array, but only foo/index.css is allowed in helpers.

This still seems like a regression to me, since it worked flawlessly with rails 3.2. So my question remains: is this desired behavior or a bug?

Thanks for your time and effort!

LeEnno avatar Nov 24 '15 08:11 LeEnno

I'm experiencing a similar problem when I upgraded sprockets-rails to v2.2.4, during an Rails upgrade from 4.2.0 to 4.2.5.1.

My fix was also similar: I have to precompile the index file foo/index.js and bar/index.js instead, i.e.:

Rails.application.config.assets.precompile += ['foo/index.js', 'bar/index.js']

Not sure if this is intended, but definitely think this should be documented if it is.

wizjo avatar Jan 29 '16 03:01 wizjo

But this enforcement of having to write foo/index instead of foo leaves the whole convention of index files useless, unless you use it in a require statement (*= require foo). This difference between require in asset files and stylesheet_link_tag is confusing and probably not intended (I'd guess).

LeEnno avatar Jan 29 '16 10:01 LeEnno