如何制作一个可选的强参数键仍然可以过滤嵌套在其中的参数?

我在我的控制器中有这个:

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 for it)。

所以我的问题是: 如何使params[:item]可选,但如果它存在,仍然在其中过滤属性?

关于什么:

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

您不能要求可选参数。 这是矛盾的。

编辑:正如mtjhax在他的评论中提到的,这里有建议使用fetchparams.fetch(:item, {}).permit!