ruby-on-rails - Rails 如何区分这两个相同的表达式?

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

我正在使用 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/

相关文章:

javascript - 使用 Ruby 爬取 Javascript 繁重的网站

ruby-on-rails - Rails i18n API 的 Yaml 翻译文件中的复数形式示例

ruby-on-rails - Rails JSON 和 XML 序列化包括微秒

ruby - 为什么 rspec 不记住这个?

javascript - 渲染多杯咖啡的模式

ruby-on-rails - 升级到 Rails 4.2.0.rc3 后,ActiveModel 序列化器不再工作

ruby-on-rails - 在 Rails 用户模型中设置 default_address

ruby-on-rails - Rails 在使用 PostgreSQL 时出错

ruby-on-rails - Rails 6 从 Sidekiq Job 获取结果 - 这可能吗?

ruby-on-rails - 如何计算数组中具有特定属性值的项目?