FormHelper: convert params#to_unsafe_h only if Rails 5, add tests.

This adresses an issue correctly brought up by @ryanswood in PR #644
concerning Rails 4.2 where params#to_unsafe_h still needs to be
converted from a Hash to a HWIA to respond to symbol hash keys.

I prefer to trying adding a conditional on Active Record version rather
than an extra HWIA conversion.

The tests are run for Rails 4 and 5, since ActionController::Parameters
was backported to 4.x.

Rails 3 raises if ActionController::Parameters is invoked, so the tests
are skipped in that case.

This commit is necessary because when the following is run:

    ActionController::Parameters.new(q: 1).to_unsafe_h.fetch(:q)

with Rails 5 it works, but not with Rails 4.2. The reason is that in
Rails 5, #to_unsafe_h calls
StrongParameters::convert_parameters_to_hashes which converts hashes to
HWIA, whereas in Rails 4.2 it just calls #to_hash without HWIA.
This commit is contained in:
Jon Atack 2016-07-14 16:43:00 +02:00
parent 9072028c20
commit 14e66ca59e
2 changed files with 26 additions and 12 deletions

View File

@ -121,8 +121,11 @@ module Ransack
private
def parameters_hash(params)
return params unless params.respond_to?(:to_unsafe_h)
params.to_unsafe_h
if ::ActiveRecord::VERSION::MAJOR == 5 && params.respond_to?(:to_unsafe_h)
params.to_unsafe_h
else
params
end
end
def extract_sort_fields_and_mutate_args!(args)

View File

@ -329,18 +329,14 @@ module Ransack
it { should match /exist\=existing/ }
end
context 'using real ActionController Parameter object',
if: ::ActiveRecord::VERSION::MAJOR > 4 do
describe '#sort_link should include search params' do
context 'using a real ActionController::Parameter object',
if: ::ActiveRecord::VERSION::MAJOR > 3 do
describe '#sort_link should include search params with symbol q:' do
subject { @controller.view_context.sort_link(Person.search, :name) }
let(:params) {
ActionController::Parameters
.new({ 'q' => { name_eq: 'TEST' }, controller: 'people' })
}
let(:params) { ActionController::Parameters.new(
{ :q => { name_eq: 'TEST' }, controller: 'people' }
) }
before { @controller.instance_variable_set(:@params, params) }
it {
@ -351,6 +347,21 @@ module Ransack
}
end
describe "#sort_link should include search params with string 'q'" do
subject { @controller.view_context.sort_link(Person.search, :name) }
let(:params) {
ActionController::Parameters.new(
{ 'q' => { name_eq: 'Test2' }, controller: 'people' }
) }
before { @controller.instance_variable_set(:@params, params) }
it {
should match(
/people\?q(%5B|\[)name_eq(%5D|\])=Test2&q(%5B|\[)s(%5D|\])
=name\+asc/x,
)
}
end
end
end