2017-08-23 5 views
0

RailsのActionController :: Parametersから値を追加/削除する最も良い方法は何ですか? 例えば:ActionController :: Parametersに値を追加/削除する方法

[96] pry(main)> params = ActionController::Parameters.new({controller: "home", action: 'index', prop1: "val"}) 
=> <ActionController::Parameters {"controller"=>"home", "action"=>"index", "prop1"=>"val"} permitted: false> 
[97] pry(main)> my_params = params.permit(:prop1) 
=> <ActionController::Parameters {"prop1"=>"val"} permitted: true> 
[98] pry(main)> my_params.merge(prop1: "val2") 
=> <ActionController::Parameters {"prop1"=>"val2"} permitted: true> 

私はこのような動作を必要とする:

# add 
pry(main)> my_params 
=> <ActionController::Parameters {"prop1"=>"val1"} permitted: true> 
pry(main)> my_params.awesome_add(prop1: "val2") 
<ActionController::Parameters {"prop1"=>["val1", "val2"]} permitted: true> 
# remove 
pry(main)> my_params.awesome_remove(prop1: "val1") 
=> <ActionController::Parameters {"prop1"=>"val2"} permitted: true> 
+0

あなたが探しているすばらしい方法は意味をなさないものです。あなたは実際のアプリケーションで何を達成しようとしていますか?他の場所で問題を修正する可能性があります。 –

+0

OK、ビュー内の各スコープのクエリ文字列でパスを生成する方法(filter.erb.html)以前のパラメータを削除せずにgem has_scopeを使用しましたか? – user3430722

答えて

0

Hash#mergeは、元を変化させません。これを行うとparamsは変更されません。

params.merge(key: "value") 

同じことがActionController::Parametersの真実である:

my_params.merge(prop1: "val2") 
=> <ActionController::Parameters {"prop1"=>"val2"} permitted: true> 

あなたがその呼び出しの結果を使用する場合は、所定の位置にmy_paramsを変異させるビッグバン方式merge!を使用するか、または結果を割り当てる必要がありますどちらか変数:

my_params = my_params.merge(some: "thing") 
+0

OPが欲しいのは、配列で "string"値を更新し、その逆もまたいくつかの魔法です。それはかなり奇妙なことです。 –

+0

@ArupRakshit私は同意しません。彼はコントローラーの 'params'を修正する必要があり、編集をしないメソッドを使用しています。乾杯。 – coreyward

+0

ここにどのようなパターンがありますか? 'PRY(主)> my_params => "VAL1"}許可:真> PRY(主)> my_params.awesome_add(PROP1: "VAL2") OP1 "=" val1 "=>" val1 "=> [" prop1 "=> [" val1 "、" val2 "]} } '' prop1 "=> [" val1 "、" val2 "]' .. 'prop1:" val2 "'だけを提供します。ここでは、 'merge'メソッドはツールではなく、手を使わずに何かを作ったツールが何かを知りません。 –

関連する問題