Merge pull request #33324 from Jcambass/fix-only-path-option-in-url-for-with-arrays

respect only_path option when an array is passed into url_for
This commit is contained in:
Ryuta Kamizono 2018-10-08 17:52:39 +09:00 committed by GitHub
commit d4127a014c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 27 additions and 11 deletions

@ -1,3 +1,9 @@
* Respect the `only_path` option passed to `url_for` when the options are passed in as an array
Fixes #33237.
*Joel Ambass*
* Deprecate calling private model methods from view helpers.
For example, in methods like `options_from_collection_for_select`

@ -84,25 +84,24 @@ def url_for(options = nil)
super(only_path: _generate_paths_by_default)
when Hash
options = options.symbolize_keys
unless options.key?(:only_path)
options[:only_path] = only_path?(options[:host])
end
ensure_only_path_option(options)
super(options)
when ActionController::Parameters
unless options.key?(:only_path)
options[:only_path] = only_path?(options[:host])
end
ensure_only_path_option(options)
super(options)
when :back
_back_url
when Array
components = options.dup
if _generate_paths_by_default
polymorphic_path(components, components.extract_options!)
options = components.extract_options!
ensure_only_path_option(options)
if options[:only_path]
polymorphic_path(components, options)
else
polymorphic_url(components, components.extract_options!)
polymorphic_url(components, options)
end
else
method = _generate_paths_by_default ? :path : :url
@ -138,8 +137,10 @@ def _generate_paths_by_default
true
end
def only_path?(host)
_generate_paths_by_default unless host
def ensure_only_path_option(options)
unless options.key?(:only_path)
options[:only_path] = _generate_paths_by_default unless options[:host]
end
end
end
end

@ -75,6 +75,15 @@ def test_url_for_with_invalid_referer
assert_equal "javascript:history.back()", url_for(:back)
end
def test_url_for_with_array_defaults_to_only_path_true
assert_equal "/other", url_for([:other, { controller: "foo" }])
end
def test_url_for_with_array_and_only_path_set_to_false
default_url_options[:host] = "http://example.com"
assert_equal "http://example.com/other", url_for([:other, { controller: "foo", only_path: false }])
end
def test_to_form_params_with_hash
assert_equal(
[{ name: "name", value: "David" }, { name: "nationality", value: "Danish" }],