I also tried using digest in development and learned something: you can
change an asset by moving one section of the file to another section and
even though the file is thumbprinted/digested, sometimes the browser won't
reload it.
Basically, I changed config/environments/development.rb to use:
config.assets.debug = false
config.assets.digest = true
and much of the time if I move one section of the file to another part of
the same file (and I tried in a few different ways), the browser (FF 17 in
OS X) won't reload the asset because it is still cached, even when I am
forcing Sprockets to cache-bust via this patch in
config/initializers/.../name_of_my_patch.rb
# Sprockets 2.x patch to cache-bust non-fingerprinted angular template html
in development
if Rails.env.development?
module Sprockets
module Server
private
# want to attempt to be compatible as much as possible so we'll call
their headers method 'sprockets_headers' and then
# override just the headers we want. this may or may not work in
future versions as this is a private method.
alias_method :sprockets_headers, :headers
def headers(env, asset, length)
sprockets_headers(env, asset, length).tap do |headers|
# both digested/thumbprinted and non-digested files seem to not
refresh cache (at least with FF 17)
# so, use cache-busters for .../app/assets/**/*
if asset.pathname.to_s['/app/assets/']
puts "cache-busting #{asset.pathname.to_s}
etag_header=#{headers["ETag"]}
path_fingerprint(env[\"PATH_INFO\"])=#{path_fingerprint(env["PATH_INFO"])}"
headers["Cache-Control"] = "max-age=0, private, must-revalidate"
end
end
end
end
end
end
However, with that patch, if I comment out the following:
#config.assets.debug = false
#config.assets.digest = true
It seems to work as intended.
On Tuesday, December 18, 2012 3:57:46 PM UTC-5, Gary Weaver wrote:
>
> Just monkey patched Sprockets in our Rails 3.2.9 app to override the
> Cache-Control header for html assets that we need to tweak more often in
> development, but that we don't want to use digests/fingerprinting with:
>
> # Sprockets 2.x patch
> if Rails.env.development?
> module Sprockets
> module Server
>
> private
> alias_method :sprockets_headers, :headers
>
> def headers(env, asset, length)
> sprockets_headers(env, asset, length).tap do |headers|
> # cache-bust .html assets because in our case they are
> frequently AngularJS templates we need to tweak
> if !path_fingerprint(env["PATH_INFO"]) &&
> asset.pathname.basename.to_s['.html']
> headers["Cache-Control"] = "max-age=0, private,
> must-revalidate"
> end
> end
> end
> end
> end
> end
>
> Would the ability to configure "Cache-Control" and other headers (or add
> headers) in responses for assets in Sprockets be helpful to have available
> in Rails, or is it just assumed that if you need that level of control,
> you'll fix it elsewhere with nginx, apache, etc.?
>
> Why I'm asking is that Heroku shows here how to change expiry of actions:
> https://devcenter.heroku.com/articles/http-caching-ruby-rails
>
> but, I couldn't find anywhere that talked about how to expire assets other
> than using digests/fingerprinting, until I came across server.rb in
> sprockets and realized that it didn't look like it was possible without
> monkey patching or using another gem that would override the headers.
>
>
--
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/-/LjvlTx7rRFQJ.
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.