diff options
Diffstat (limited to 'actionpack/lib/action_view/helpers/asset_tag_helpers/asset_id_caching.rb')
-rw-r--r-- | actionpack/lib/action_view/helpers/asset_tag_helpers/asset_id_caching.rb | 67 |
1 files changed, 67 insertions, 0 deletions
diff --git a/actionpack/lib/action_view/helpers/asset_tag_helpers/asset_id_caching.rb b/actionpack/lib/action_view/helpers/asset_tag_helpers/asset_id_caching.rb new file mode 100644 index 0000000000..36fe961a72 --- /dev/null +++ b/actionpack/lib/action_view/helpers/asset_tag_helpers/asset_id_caching.rb @@ -0,0 +1,67 @@ +require 'active_support/concern' + +module ActionView + module Helpers + module AssetTagHelper + + module AssetIdCaching + extend ActiveSupport::Concern + + included do + # You can enable or disable the asset tag timestamps cache. + # With the cache enabled, the asset tag helper methods will make fewer + # expensive file system calls. However this prevents you from modifying + # any asset files while the server is running. + # + # ActionView::Helpers::AssetTagHelper.cache_asset_timestamps = false + mattr_accessor :cache_asset_timestamps + + private + mattr_accessor :asset_timestamps_cache + self.asset_timestamps_cache = {} + + mattr_accessor :asset_timestamps_cache_guard + self.asset_timestamps_cache_guard = Mutex.new + end + + private + + # Use the RAILS_ASSET_ID environment variable or the source's + # modification time as its cache-busting asset id. + def rails_asset_id(source) + if asset_id = ENV["RAILS_ASSET_ID"] + asset_id + else + if self.cache_asset_timestamps && (asset_id = self.asset_timestamps_cache[source]) + asset_id + else + path = File.join(config.assets_dir, source) + asset_id = File.exist?(path) ? File.mtime(path).to_i.to_s : '' + + if self.cache_asset_timestamps + self.asset_timestamps_cache_guard.synchronize do + self.asset_timestamps_cache[source] = asset_id + end + end + + asset_id + end + end + end + + # Break out the asset path rewrite in case plugins wish to put the asset id + # someplace other than the query string. + # This is the default implementation + def handle_asset_id(source) + asset_id = rails_asset_id(source) + if asset_id.empty? + source + else + "#{source}?#{asset_id}" + end + end + end + + end + end +end
\ No newline at end of file |