私は私のコントローラーにこれを持っています:
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]
をオプションにし、それでも属性が存在する場合はその中の属性をフィルタリングするのですか?
どうですか:
params.require(:item).permit! if params[:item]
オプションのパラメーターは必要ありません。それは矛盾しています。
編集:mtjhaxが彼のコメントで述べたように、 ここ から代わりにfetch
を使用するようにアドバイスがあります:params.fetch(:item, {}).permit!