通过link_to合并嵌套参数

时间:2013-10-11 00:36:40

标签: ruby-on-rails-3 merge nested-attributes params ransack

我正在使用嵌套的params(通过ransack嵌套为q)和普通的params一起在页面上构建链接,当我尝试将嵌套的params与其他params合并时,我很难让两者完美地玩。< / p>

例如,如果我有:

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

尝试构建一个链接,用

更改参数“lowEquity_true”
rates_url(params[:q].merge(:lowEquity_true => '0'))

然后我最终得到了下面的新参数,这看起来像是更新了q但是丢弃了其余的参数。

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

如果我改为尝试合并q&amp;合并到其他没有更新q的params,只是将q中的内容合并到其他参数中

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"}

我尝试了各种各样的组合,似乎没有任何地方,所以我确定我错过了一些基本的东西!

1 个答案:

答案 0 :(得分:6)

你做错了。

让我用一个例子来解释:

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}合并到原始参数{: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)

就是这样

我希望你能说明mergemerge!之间的区别: - merge!具有破坏性,它会修改原始参数,而merge除非您将其置于变量中并使用它。

或者,如果您想在一行中执行上述相同的操作,那么只需执行

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

OR

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