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

sni*_*tko 21 ruby strong-parameters ruby-on-rails-4

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

params.require(:item).permit!
Run Code Online (Sandbox Code Playgroud)

让我们假设这个rspec规范:

put :update, id: @item.id, item: { name: "new name" }
Run Code Online (Sandbox Code Playgroud)

它按预期工作,没有错误.但是,如果我使用这个:

put :update, id: @item.id, item: nil
Run Code Online (Sandbox Code Playgroud)

我得到ActionController::ParameterMissing了我不想得到的东西.它与我用于其他操作的控制器宏有关,通过它我无法控制被发送的参数(宏检查用户凭据,因此我并不真正关心实际测试#update操作,而是我只测试before_filters for它).

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

Dam*_*che 39

关于什么:

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

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

编辑:作为mtjhax在他的评论中提到的,从建议在这里使用fetch,而不是:params.fetch(:item, {}).permit!