4

我正在使用嵌套参数(通过嵌套为 q 的 ransack)与普通参数一起在页面上构建链接,当我尝试将嵌套参数与其他参数合并时,我无法让两者正常播放。

例如,如果我有:

{"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 并合并到其他参数中,它不会更新 q,而只是将 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"}

我尝试了各种不同的组合,但似乎没有得到任何结果,所以我确信我错过了一些基本的东西!

4

1 回答 1

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)

而已

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')))
于 2013-10-11T05:07:59.893 回答