我正在使用 4 年前的 Rails 教程,并且我有 Rails 4.0.2。我制作了一个名为“Thing”的模型和一个名为“Things”的 Controller 。 “事物”模型有一个称为“数据”的属性。在我的 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 如何区分它们?
最佳答案
params[:thing]
与 {"data"=> "12345"}
不同,它们只是在 inspect 时具有相同的值
在它们上被调用,params
的类覆盖 ==
说它等于散列。
Rails 4+ 使用 Strong Parameters ,这是一项安全功能,可确保您知道要放入模型中的内容。基本上,Rails 希望您检查参数的有效性。它允许您执行 Thing.new({"data"=> "12345"})
因为您,开发人员,直接创建哈希,并且比互联网上调用您的服务器的人更值得信赖.
关于ruby-on-rails - Rails 如何区分这两个相同的表达式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31482749/