In 2fe70c1 (last year), rails changed from a static list of assets.paths to
automatically register any path under assets/*. (This was not reflected in
Rails Guides so I pushed an update to docrails.)
However, in my opinion, these automatic asset paths create confusion.
The result is that the first-level directories under `(app|lib|vendor)/assets`
get swallowed and if I put assets into a directory of my own naming, it will
conflict with assets from another asset path. e.g.
app/assets/images/icons/close.png
vendor/assets/xyz/icons/close.png
Here, the path segments "images" and "xyz" become asset path roots, so both of
the above resolve as icons/close.png, and serve from /assets/icons/close.png.
(If you didn't expect that, I should point out that the file from app will take
precedence.)
I don't know if I'm missing how this is expected to be used. I might expect
app/assets/stylesheets, lib/assets/stylesheets, and vendor/assets/stylesheets
to correspond and mask each other, but not a subdirectory of my own naming.
Take for example a typical frontend widget I might want to download and install:
foo/widget.js
foo/styles.css
foo/images/click.png
If I want to keep this in a namespaced asset bundle instead of reorganizing it
into separate javascripts/stylesheets/images directories, I can't just drop the
folder into vendor/assets, as the asset paths will swallow the "foo" directory
name, leaving the files naked in public/assets. In my manifests, these also
automatically become available directly as "styles.css" and "widget.js" without
a "foo/" prefix.
I could arbitrarily put it into vendor/assets/javascripts/foo (or
vendor/assets/whatever/foo), but that makes no sense: it's not all just
javascripts, it's a whole package. Is it really the right solution to just nest
things 2 levels down so as not to lose the subdirectory for namespacing?
For vendor/assets packages, ideally I think the way to handle such packages is
to define a "foo.js" and "foo.css" manifest to wrap the vendored package, and
keep all its files scoped under its own directory, e.g.
vendor/assets/foo.css # manifest file: //= require
'./foo/widget.css'
vendor/assets/foo.js # manifest file: //= require
'./foo/widget.js'
vendor/assets/foo/widget.js
vendor/assets/foo/styles.css
vendor/assets/foo/images/click.png
(Alternately, the manifests could be index files inside the folder.)
These would correspond to the public paths:
/assets/foo/styles.css # not used directly when included through a manifest
/assets/foo/widget.js # not used directly when included through a manifest
/assets/foo/images/click.png
This would make the package available in application.(css|js) as a simple
"require foo"
How best to configure rails for this? Should
assets/(stylesheets|javascripts|images) be magically considered "global" or
should the initializer for sub-paths under assets be dropped altogether,
leaving it to the user to organize assets how they see fit?
(Also, currently there's that somewhat confusing mismatch between app/assets
and public/assets, where app/assets is organized into subdirectories for
javascripts & stylesheets, and public is not -- defaulting to just assets as
the config path instead of assets/* could fix that.)
Are there any established usage patterns I'm missing, or should Rails consider
something to organize this better by default?
--
You received this message because you are subscribed to the Google Groups "Ruby
on Rails: Core" group.
To view this discussion on the web visit
https://groups.google.com/d/msg/rubyonrails-core/-/dWp6EGpUJZUJ.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to
[email protected].
For more options, visit this group at
http://groups.google.com/group/rubyonrails-core?hl=en.