blob: 64a193e4bee84a6b2d10f9e453d8aa9ffc07cab5 (
plain) (
tree)
|
|
require 'thread'
require 'active_support/core_ext/file'
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
|