Rails如何知道这两个相同表达式之间的区别?

时间:2015-07-17 18:51:20

标签: ruby-on-rails ruby ruby-on-rails-4

我使用的是4年前的Rails教程,我使用的是Rails 4.0.2。我制作了一个名为“Thing”的模型和一个名为“Things”的控制器。 “Thing”模型有一个名为“data”的属性。在我的create行动中,我有这一行:

@thing = Thing.new(params[:thing])

会导致此错误:

ActiveModel::ForbiddenAttributesError in ThingsController#create

我找到了一个StackOverflow线程,说我需要require我需要的参数,并且工作得很好。

在我查看之前,我尝试将我的参数中的哈希直接放入Thing.new()方法中,但我没有收到错误。我从这一行开始:

puts params[:thing]

在我的create操作中,在我的文本字段中键入“12345”,点击提交并在控制台中获取此内容:

{"data"=>"12345"}

所以我在create操作中尝试了这个:

@thing = Thing.new({"data" => "12345"})

我没有得到错误。我甚至通过这样做确认他们是完全相同的:

puts params[:thing] == {"data"=>"12345"}

我在控制台上得到“true”。所以,

Thing.new(params[:thing])

给了我错误,但是

Thing.new({"data"=>"12345"})

没有。

当Rails看起来相同时,Rails如何区分这两个参数呢?

1 个答案:

答案 0 :(得分:6)

params[:thing]{"data" => "12345"}不同,它们在调用inspect时具有相同的值,params的类覆盖==说它等于哈希值。

Rails 4+使用Strong Parameters,这是一项安全功能,可确保您了解自己在模型中添加的内容。基本上,Rails想要检查参数的有效性。它允许您执行Thing.new({"data" => "12345"}),因为您(开发人员)正在直接创建Hash,并且比在互联网上呼叫您的服务器的人更值得信赖。