50

これは Rails の質問よりも Ruby の質問かもしれませんが、バニラの Ruby アプリケーションでこれを行うことができたと確信しています。

強力なパラメーターが定義されています。

def trip_params
  params.require(:trip).permit(:name, :date)
end

これで、コントローラー メソッドでこれらのパラメーターを取得できます。私はこれをしたいです。

def save
  trip_params[:name] = 'Modifying name in place'
  #trip_params[:name] still equals original value passed
end

これは決して機能しません。 名前は決して変わりません。ところで: trip_params のタイプは ActionController::Parameters です

標準の Ruby スクリプトを実行すると、機能します。

test = {}    
test[:name] = "blah"    
test[:name] = "ok"    
puts test #{:name=>"ok"}
4

4 に答える 4

70

permitparamsこれらのキーを含む新しいハッシュを返すため、実際の変数を変更していません。また、ハッシュ trip_params の戻り値への参照を保存していないため、save.

これを試して:

def save
  tp = trip_params
  tp[:name] = 'Modifying name in place'
  # ... use tp later, it'll be in there
end

または、以前と同じように使用したい場合は、次のtrip_paramsように変更します。

def trip_params
  @trip_params ||= params.require(:trip).permit(:name, :date)
end

これで、ハッシュが遅延キャッシュされ、後続のtrip_params呼び出しで同じハッシュが返されます。

于 2013-08-22T01:21:47.780 に答える
28

コントローラーのパラメーターを本当に変更したい場合は、次の方法で実行できます。

def save
  params[:trip][:name] = 'Modifying name in place'
  # Now trip_params[:name] is 'Modifying name in place'
end
于 2013-11-26T10:46:34.700 に答える
5

あなたもできる

def save
  data = trip_params.merge(name: 'new name')
  # use data later
end

新しいハッシュが古いハッシュにマージされ、重複するキーがある場合、新しいハッシュのキーが古いハッシュの一致するキーを上書きします。

于 2016-09-22T03:41:41.557 に答える