2013-10-11 3 views
4

Я использую вложенные параметры (через ransack, вложенные как q), наряду с нормальными параметрами, чтобы создавать ссылки на странице, и у меня возникают проблемы с тем, чтобы они играли хорошо, когда я пытаюсь объединить вложенные параметры с помощью другие параметры.Объединить вложенные параметры через link_to

Например, если у меня есть:

{"freq"=>"weekly", "loan_amount"=>"350000", 
"q"=>{"lowEquity_true"=>"1", "s"=>"rate asc"}} 

и попытаться построить ссылку для изменения параметров «lowEquity_true» с

rates_url(params[:q].merge(:lowEquity_true => '0')) 

тогда я в конечном итоге с новыми Params ниже, который выглядит как и обновленный q, но оставил остальные параметры.

{"lowEquity_true"=>"0", "s"=>"rate asc"} 

Если я вместо этого попытаться объединить д & сливается в другую Params не обновляет д, а просто сливается, что было в д в других Params вместо

rates_url(params[:q].merge(:lowEquity_true => '0').merge(params)) 

{"freq"=>"weekly", "loan_amount"=>"350000", "lowEquity_true"=>"0", 
"q"=>{"lowEquity_true"=>"1", "s"=>"rate asc"}, 
"s"=>"rate asc"} 

Я пробовал всевозможные комбинации и, кажется, никуда не денутся, поэтому я уверен, что у меня что-то не хватает!

ответ

5

Вы делаете это неправильно.

Поясню на примере:

params = {:a => 1, :b => 2, :q => {:x => 24, :y => 25}} 

На данный момент params[:q] является

{:x=>24, :y=>25} 

Если я,

params[:q].merge(:x => 99) 

тогда мой params[:q] станет

{:x=>99, :y=>25} 

и это то, что вы поставляете в качестве аргумента rates_url(params[:q].merge(:lowEquity_true => '0'))

, поэтому только {"lowEquity_true"=>"0", "s"=>"rate asc"} передаются rates_url в качестве параметров.

Теперь, если вы делаете что-то вроде

params[:q].merge(:x => 99).merge(params) 

затем params[:q].merge(:x => 99) дает {:x=>99, :y=>25}, а затем сливается {:x=>99, :y=>25} в исходные Params {:a => 1, :b => 2, :q => {:x => 24, :y => 25}} , так что это приводит к

{:x=>99, :y=>25, :a=>1, :b=>2, :q=>{:x=>24, :y=>25}} 

Теперь, позвольте мне объясните, что вы должны сделать: -

Ваши параметры:

{"freq"=>"weekly", "loan_amount"=>"350000", 
"q"=>{"lowEquity_true"=>"1", "s"=>"rate asc"}} 

Таким образом, вы должны сделать:

params[:q].merge!(:lowEquity_true => '0') 

rates_url(params) 

Вот это

Я надеюсь, что вы khow разницу между merge и merge!: - merge! деструктивна, она будет изменять исходный параметра Я где поскольку merge не будет, если вы не возьмете его в переменной и не пользуетесь им.

В качестве альтернативы, если вы хотите сделать то же самое говорилось выше, в одной строке, то вобще

rates_url(params.merge!(:q => {:lowEquity_true => '0', "s"=>"rate asc"})) 

ИЛИ

rates_url(params.merge(:q => params[:q].merge(:lowEquity_true => '0'))) 
Смежные вопросы