我正在使用嵌套的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"}
我尝试了各种各样的组合,似乎没有任何地方,所以我确定我错过了一些基本的东西!
答案 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)
就是这样
我希望你能说明merge
和merge!
之间的区别: -
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')))