即使我们没有明确地将白名单:id,params [:id]如何不抛出异常?

时间:2014-05-01 15:30:05

标签: ruby-on-rails strong-parameters

在rails 4.x中,strong_parameters需要明确允许参数。然而,在下面的示例中,我没有得到ForbiddenAttributesError - 为什么:idshow操作时不会抛出,即使它没有明确允许?

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

4 个答案:

答案 0 :(得分:3)

强参数仅用于分配属性。您可以使用任何参数自由搜索和执行其他操作,而不是批量分配。

您可以看到更深入的解释和示例in Rails Guides

答案 1 :(得分:3)

请参阅:http://edgeguides.rubyonrails.org/action_controller_overview.html#strong-parameters

"使用强参数时,禁止在动态模型批量分配中使用动作控制器参数,直到它们被列入白名单。"

执行find是完全有效的,事实上,它显示在上面链接到的文档中的示例中。

答案 2 :(得分:1)

对于Rails,params[:id]在默认参数之外。

  • 查询字符串: www.example.com/foo/123?bar=1&baz=2

  • 请求路径: www.example.com/foo/123 123params[:id]

  • bar=1&baz=2
  • Paramerts:  123可以允许这样做

如果您将:id传递给参数,则需要允许{{1}}。

答案 3 :(得分:0)

除非您愿意,否则无需明确允许:id。如果想要检查implicitly是否已列入白名单,您可以执行此操作:idputs params[:foo]创建后,您可以看到log.you会看到类似这样的内容

{id=>some_id, "name"=>"some_name", "adddress"=>"some_address"}

所以,定义像这样的Foo对象

@foo = Foo.find(params[:id])

不会抛出异常。

希望它有所帮助!