diff --git a/actionpack/lib/action_view/helpers/asset_url_helper.rb b/actionpack/lib/action_view/helpers/asset_url_helper.rb
index 72a9dff82c..d75e4c0edc 100644
--- a/actionpack/lib/action_view/helpers/asset_url_helper.rb
+++ b/actionpack/lib/action_view/helpers/asset_url_helper.rb
@@ -107,11 +107,6 @@ module ActionView
module AssetUrlHelper
URI_REGEXP = %r{^[-a-z]+://|^(?:cid|data):|^//}
- ASSET_EXTENSIONS = {
- javascript: '.js',
- stylesheet: '.css'
- }
-
# Computes the path to asset in public directory. If :type
# options is set, a file extension will be appended and scoped
# to the corresponding public directory.
@@ -127,8 +122,8 @@ module ActionView
return "" unless source.present?
return source if source =~ URI_REGEXP
- if File.extname(source).empty? && (ext = ASSET_EXTENSIONS[options[:type]])
- source = "#{source}#{ext}"
+ if extname = compute_asset_extname(source, options)
+ source = "#{source}#{extname}"
end
if source[0] != ?/
@@ -157,6 +152,19 @@ module ActionView
end
alias_method :url_to_asset, :asset_url # aliased to avoid conflicts with an asset_url named route
+ ASSET_EXTENSIONS = {
+ javascript: '.js',
+ stylesheet: '.css'
+ }
+
+ # Compute extname to append to asset path. Returns nil if
+ # nothing should be added.
+ def compute_asset_extname(source, options = {})
+ return if options[:extname] == false
+ extname = options[:extname] || ASSET_EXTENSIONS[options[:type]]
+ extname if extname && File.extname(source) != extname
+ end
+
# Maps asset types to public directory.
ASSET_PUBLIC_DIRECTORIES = {
audio: '/audios',
diff --git a/actionpack/test/template/asset_tag_helper_test.rb b/actionpack/test/template/asset_tag_helper_test.rb
index 30bd5c159c..26a229e2ba 100644
--- a/actionpack/test/template/asset_tag_helper_test.rb
+++ b/actionpack/test/template/asset_tag_helper_test.rb
@@ -43,6 +43,11 @@ class AssetTagHelperTest < ActionView::TestCase
%(asset_path("dir/xml.png")) => %(/dir/xml.png),
%(asset_path("/dir/xml.png")) => %(/dir/xml.png),
+ %(asset_path("script.min")) => %(/script.min),
+ %(asset_path("script.min.js")) => %(/script.min.js),
+ %(asset_path("style.min")) => %(/style.min),
+ %(asset_path("style.min.css")) => %(/style.min.css),
+
%(asset_path("style", type: :stylesheet)) => %(/stylesheets/style.css),
%(asset_path("xmlhr", type: :javascript)) => %(/javascripts/xmlhr.js),
%(asset_path("xml.png", type: :image)) => %(/images/xml.png)
@@ -66,7 +71,9 @@ class AssetTagHelperTest < ActionView::TestCase
JavascriptPathToTag = {
%(javascript_path("xmlhr")) => %(/javascripts/xmlhr.js),
%(javascript_path("super/xmlhr")) => %(/javascripts/super/xmlhr.js),
- %(javascript_path("/super/xmlhr.js")) => %(/super/xmlhr.js)
+ %(javascript_path("/super/xmlhr.js")) => %(/super/xmlhr.js),
+ %(javascript_path("xmlhr.min")) => %(/javascripts/xmlhr.min.js),
+ %(javascript_path("xmlhr.min.js")) => %(/javascripts/xmlhr.min.js)
}
PathToJavascriptToTag = {
@@ -91,7 +98,6 @@ class AssetTagHelperTest < ActionView::TestCase
%(javascript_include_tag("bank")) => %(),
%(javascript_include_tag("bank.js")) => %(),
%(javascript_include_tag("bank", :lang => "vbscript")) => %(),
- %(javascript_include_tag("common.javascript", "/elsewhere/cools")) => %(\n),
%(javascript_include_tag("http://example.com/all")) => %(),
%(javascript_include_tag("http://example.com/all.js")) => %(),
@@ -102,14 +108,17 @@ class AssetTagHelperTest < ActionView::TestCase
%(stylesheet_path("bank")) => %(/stylesheets/bank.css),
%(stylesheet_path("bank.css")) => %(/stylesheets/bank.css),
%(stylesheet_path('subdir/subdir')) => %(/stylesheets/subdir/subdir.css),
- %(stylesheet_path('/subdir/subdir.css')) => %(/subdir/subdir.css)
+ %(stylesheet_path('/subdir/subdir.css')) => %(/subdir/subdir.css),
+ %(stylesheet_path("style.min")) => %(/stylesheets/style.min.css),
+ %(stylesheet_path("style.min.css")) => %(/stylesheets/style.min.css)
}
PathToStyleToTag = {
%(path_to_stylesheet("style")) => %(/stylesheets/style.css),
%(path_to_stylesheet("style.css")) => %(/stylesheets/style.css),
%(path_to_stylesheet('dir/file')) => %(/stylesheets/dir/file.css),
- %(path_to_stylesheet('/dir/file.rcss')) => %(/dir/file.rcss)
+ %(path_to_stylesheet('/dir/file.rcss', :extname => false)) => %(/dir/file.rcss),
+ %(path_to_stylesheet('/dir/file', :extname => '.rcss')) => %(/dir/file.rcss)
}
StyleUrlToTag = {
@@ -123,7 +132,8 @@ class AssetTagHelperTest < ActionView::TestCase
%(url_to_stylesheet("style")) => %(http://www.example.com/stylesheets/style.css),
%(url_to_stylesheet("style.css")) => %(http://www.example.com/stylesheets/style.css),
%(url_to_stylesheet('dir/file')) => %(http://www.example.com/stylesheets/dir/file.css),
- %(url_to_stylesheet('/dir/file.rcss')) => %(http://www.example.com/dir/file.rcss)
+ %(url_to_stylesheet('/dir/file.rcss', :extname => false)) => %(http://www.example.com/dir/file.rcss),
+ %(url_to_stylesheet('/dir/file', :extname => '.rcss')) => %(http://www.example.com/dir/file.rcss)
}
StyleLinkToTag = {
@@ -132,7 +142,6 @@ class AssetTagHelperTest < ActionView::TestCase
%(stylesheet_link_tag("/elsewhere/file")) => %(),
%(stylesheet_link_tag("subdir/subdir")) => %(),
%(stylesheet_link_tag("bank", :media => "all")) => %(),
- %(stylesheet_link_tag("random.styles", "/elsewhere/file")) => %(\n),
%(stylesheet_link_tag("http://www.example.com/styles/style")) => %(),
%(stylesheet_link_tag("http://www.example.com/styles/style.css")) => %(),