module Sprockets::Rails::Helper
Constants
- VIEW_ACCESSORS
Public Class Methods
# File lib/sprockets/rails/helper.rb, line 60 def self.extended(obj) obj.singleton_class.class_eval do attr_accessor(*VIEW_ACCESSORS) remove_method :assets_environment def assets_environment if env = @assets_environment @assets_environment = env.cached else nil end end end end
# File lib/sprockets/rails/helper.rb, line 43 def self.included(klass) klass.class_attribute(*VIEW_ACCESSORS) klass.class_eval do remove_method :assets_environment def assets_environment if instance_variable_defined?(:@assets_environment) @assets_environment = @assets_environment.cached elsif env = self.class.assets_environment @assets_environment = env.cached else nil end end end end
Public Instance Methods
Expand asset path to digested form.
path - String path options - Hash options
Returns String path or nil if no asset was found.
# File lib/sprockets/rails/helper.rb, line 113 def asset_digest_path(path, options = {}) resolve_asset do |resolver| resolver.digest_path path, options[:debug] end end
Experimental: Get integrity for asset path.
path - String path options - Hash options
Returns String integrity attribute or nil if no asset was found.
# File lib/sprockets/rails/helper.rb, line 125 def asset_integrity(path, options = {}) path = path_with_extname(path, options) resolve_asset do |resolver| resolver.integrity path end end
# File lib/sprockets/rails/helper.rb, line 48 def assets_environment if instance_variable_defined?(:@assets_environment) @assets_environment = @assets_environment.cached elsif env = self.class.assets_environment @assets_environment = env.cached else nil end end
Writes over the built in ActionView::Helpers::AssetUrlHelper#compute_asset_path to use the asset pipeline.
# File lib/sprockets/rails/helper.rb, line 77 def compute_asset_path(path, options = {}) debug = options[:debug] if asset_path = resolve_asset_path(path, debug) File.join(assets_prefix || "/", legacy_debug_path(asset_path, debug)) else message = "The asset #{ path.inspect } is not present in the asset pipeline.\n" raise AssetNotFound, message unless unknown_asset_fallback if respond_to?(:public_compute_asset_path) message << "Falling back to an asset that may be in the public folder.\n" message << "This behavior is deprecated and will be removed.\n" message << "To bypass the asset pipeline and preserve this behavior,\n" message << "use the `skip_pipeline: true` option.\n" call_stack = Kernel.respond_to?(:caller_locations) && ::Rails::VERSION::MAJOR >= 5 ? caller_locations : caller ActiveSupport::Deprecation.warn(message, call_stack) end super end end
Override javascript tag helper to provide debugging support.
Eventually will be deprecated and replaced by source maps.
# File lib/sprockets/rails/helper.rb, line 136 def javascript_include_tag(*sources) options = sources.extract_options!.stringify_keys integrity = compute_integrity?(options) if options["debug"] != false && request_debug_assets? sources.map { |source| if asset = lookup_debug_asset(source, type: :javascript) if asset.respond_to?(:to_a) asset.to_a.map do |a| super(path_to_javascript(a.logical_path, debug: true), options) end else super(path_to_javascript(asset.logical_path, debug: true), options) end else super(source, options) end }.flatten.uniq.join("\n").html_safe else sources.map { |source| options = options.merge('integrity' => asset_integrity(source, type: :javascript)) if integrity super source, options }.join("\n").html_safe end end
Override stylesheet tag helper to provide debugging support.
Eventually will be deprecated and replaced by source maps.
# File lib/sprockets/rails/helper.rb, line 165 def stylesheet_link_tag(*sources) options = sources.extract_options!.stringify_keys integrity = compute_integrity?(options) if options["debug"] != false && request_debug_assets? sources.map { |source| if asset = lookup_debug_asset(source, type: :stylesheet) if asset.respond_to?(:to_a) asset.to_a.map do |a| super(path_to_stylesheet(a.logical_path, debug: true), options) end else super(path_to_stylesheet(asset.logical_path, debug: true), options) end else super(source, options) end }.flatten.uniq.join("\n").html_safe else sources.map { |source| options = options.merge('integrity' => asset_integrity(source, type: :stylesheet)) if integrity super source, options }.join("\n").html_safe end end
Protected Instance Methods
List of resolvers in ‘config.assets.resolve_with` order.
# File lib/sprockets/rails/helper.rb, line 250 def asset_resolver_strategies @asset_resolver_strategies ||= Array(resolve_assets_with).map do |name| HelperAssetResolvers[name].new(self) end end
This is awkward: ‘integrity` is a boolean option indicating whether we want to include or omit the subresource integrity hash, but the options hash is also passed through as literal tag attributes. That means we have to delete the shortcut boolean option so it doesn’t bleed into the tag attributes, but also check its value if it’s boolean-ish.
# File lib/sprockets/rails/helper.rb, line 198 def compute_integrity?(options) if secure_subresource_integrity_context? case options['integrity'] when nil, false, true options.delete('integrity') == true end else options.delete 'integrity' false end end
Append ?body=1 if debug is on and we’re on old Sprockets
.
# File lib/sprockets/rails/helper.rb, line 258 def legacy_debug_path(path, debug) if debug && !using_sprockets4? "#{path}?body=1" else path end end
Internal method to support multifile debugging. Will eventually be removed w/ Sprockets
3.x.
# File lib/sprockets/rails/helper.rb, line 226 def lookup_debug_asset(path, options = {}) path = path_with_extname(path, options) resolve_asset do |resolver| resolver.find_debug_asset path end end
compute_asset_extname is in AV::Helpers::AssetUrlHelper
# File lib/sprockets/rails/helper.rb, line 235 def path_with_extname(path, options) path = path.to_s "#{path}#{compute_asset_extname(path, options)}" end
Enable split asset debugging. Eventually will be deprecated and replaced by source maps in Sprockets
3.x.
# File lib/sprockets/rails/helper.rb, line 218 def request_debug_assets? debug_assets || (defined?(controller) && controller && params[:debug_assets]) rescue # FIXME: what exactly are we rescuing? false end
Try each asset resolver and return the first non-nil result.
# File lib/sprockets/rails/helper.rb, line 241 def resolve_asset asset_resolver_strategies.detect do |resolver| if result = yield(resolver) break result end end end
Only serve integrity metadata for HTTPS requests:
http://www.w3.org/TR/SRI/#non-secure-contexts-remain-non-secure
# File lib/sprockets/rails/helper.rb, line 212 def secure_subresource_integrity_context? respond_to?(:request) && self.request && (self.request.local? || self.request.ssl?) end