aboutsummaryrefslogtreecommitdiffstats
path: root/actionpack/lib/action_view/helpers/asset_tag_helpers/asset_id_caching.rb
diff options
context:
space:
mode:
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.rb67
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