Mat*_*att 4 merge params nested-attributes ruby-on-rails-3 ransack
我正在使用嵌套的params(通过hansack嵌套为q)和普通的params一起在页面上构建链接,当我尝试将嵌套的params与其他params合并时,我很难让两者完美地玩.
例如,如果我有:
{"freq"=>"weekly", "loan_amount"=>"350000",
"q"=>{"lowEquity_true"=>"1", "s"=>"rate asc"}}
Run Code Online (Sandbox Code Playgroud)
并尝试构建一个链接来更改param"lowEquity_true"
rates_url(params[:q].merge(:lowEquity_true => '0'))
Run Code Online (Sandbox Code Playgroud)
然后我最终得到了下面的新参数,看起来像是更新了q但是丢掉了其余的参数.
{"lowEquity_true"=>"0", "s"=>"rate asc"}
Run Code Online (Sandbox Code Playgroud)
如果我试图将q&merge合并到其他参数中,它不会更新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"}
Run Code Online (Sandbox Code Playgroud)
我已经尝试了各种各样的组合,似乎没有任何地方,所以我确信我错过了一些基本的东西!
你做错了.
让我用一个例子来解释一下:
params = {:a => 1, :b => 2, :q => {:x => 24, :y => 25}}
Run Code Online (Sandbox Code Playgroud)
在这一点上,params[:q]是
{:x=>24, :y=>25}
Run Code Online (Sandbox Code Playgroud)
如果我做,
params[:q].merge(:x => 99)
Run Code Online (Sandbox Code Playgroud)
然后我的params[:q]意志成为
{:x=>99, :y=>25}
Run Code Online (Sandbox Code Playgroud)
这就是你作为论据提供的内容 rates_url(params[:q].merge(:lowEquity_true => '0'))
这就是为什么只{"lowEquity_true"=>"0", "s"=>"rate asc"}传递给rates_url参数.
现在,如果你做了类似的事情
params[:q].merge(:x => 99).merge(params)
Run Code Online (Sandbox Code Playgroud)
然后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}}
Run Code Online (Sandbox Code Playgroud)
现在,让我向您解释一下您应该做些什么: -
你的参数是
{"freq"=>"weekly", "loan_amount"=>"350000",
"q"=>{"lowEquity_true"=>"1", "s"=>"rate asc"}}
Run Code Online (Sandbox Code Playgroud)
所以,你应该这样做:
params[:q].merge!(:lowEquity_true => '0')
rates_url(params)
Run Code Online (Sandbox Code Playgroud)
而已
我希望你KHOW之间的区别merge和merge!: -
merge!是破坏性的,它会修改为其中原放慢参数merge会,除非你采取不变量和使用它.
或者,如果您想在一行中执行上述相同的操作,那么就这样做
rates_url(params.merge!(:q => {:lowEquity_true => '0', "s"=>"rate asc"}))
Run Code Online (Sandbox Code Playgroud)
要么
rates_url(params.merge(:q => params[:q].merge(:lowEquity_true => '0')))
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4087 次 |
| 最近记录: |