在rails 4.x中,strong_parameters要求显式允许参数。然而,在下面的例子中,我没有得到ForbiddenAttributesError
——为什么:id
在show
操作中不抛出,即使它没有被明确允许?
def FooController
...
def show
@foo = Foo.find(params[:id]) # why no exception here?
end
private
def foo_params
params.require(:foo).permit(:name, :address) # note: No :id here
end
end
请参阅:http://edgeguides.rubyonrails.org/action_controller_overview.html#strong-参数
"对于强参数,动作控制器参数在被列入白名单之前,禁止在活动模型批量分配中使用。">
执行find
是完全有效的,事实上,在上面链接到的文档中的示例中也显示了这一点。
强参数仅用于属性赋值。您可以使用任何参数自由搜索和执行其他操作,只是不能进行批量分配。
您可以在Rails Guides 中看到更深入的解释和示例
对于Rails,params[:id]
在默认参数之外。
-
查询字符串:
www.example.com/foo/123?bar=1&baz=2
-
请求路径:
www.example.com/foo/123
,其中123
是params[:id]
- 参数:
bar=1&baz=2
可以允许
如果将123
传递给参数,则需要允许的:id
。
除非你愿意,否则不需要显式允许:id
。Rails会执行implicitly
。如果你想检查:id
是否被列入白名单,你可以在创建后执行puts params[:foo]
,也可以只查看日志。你会看到类似这样的
{id=>some_id, "name"=>"some_name", "adddress"=>"some_address"}
因此,定义一个像这样的Foo
对象
@foo = Foo.find(params[:id])
不会引发异常。
希望它能有所帮助!