web-dev-qa-db-ja.com

オプションの強力なパラメーターキーを作成し、その中にネストされたパラメーターをフィルター処理するにはどうすればよいですか?

私は私のコントローラーにこれを持っています:

params.require(:item).permit!

このrspec仕様を仮定しましょう:

put :update, id: @item.id, item: { name: "new name" }

期待どおりに動作し、エラーは発生しません。ただし、これを使用する場合:

put :update, id: @item.id, item: nil

取得したくないActionController::ParameterMissingを取得します。これは、他のアクションに使用し、送信されるパラメーターを制御できないコントローラーマクロと関係があります(マクロはユーザーの資格情報をチェックするため、実際に#updateアクションをテストすることはあまり気にしません。 before_filtersをテストするだけです)。

だから私の質問は:どうすればparams[:item]をオプションにし、それでも属性が存在する場合はその中の属性をフィルタリングするのですか?

24
snitko

どうですか:

params.require(:item).permit! if params[:item]

オプションのパラメーターは必要ありません。それは矛盾しています。

編集:mtjhaxが彼のコメントで述べたように、 ここ から代わりにfetchを使用するようにアドバイスがあります:params.fetch(:item, {}).permit!

42
Damien Roche