【问题标题】:Rails attr_accessible only for seed.rb?Rails attr_accessible 仅适用于seed.rb?
【发布时间】:2012-06-22 19:49:27
【问题描述】:

我正在通过 PragProg 的自学 Rails(显然已经过时 - 我使用的是 Rails 3.2.3)Rails for PHP Developers。我发现了这本书没有提到的种子.rb 文件。我尝试为许多事情建立适当的种子条目,它给了我can't mass-assign protected attributes

经过大量搜索,看来我唯一的选择是通过attr_accessible 打开这些东西,或者关闭阻止批量分配的默认功能。但我想保留该设置所暗示的任何安全性。我不希望这些条目在播种后被编辑。我只需要先将它们放入数据库中。

我在这里没有看到什么?如何在不关闭保护的情况下播种这些数据?似乎种子应该是一种特殊情况,允许在不允许的情况下进行大规模分配。

【问题讨论】:

  • 我认为我的部分问题是我并不完全了解上述保护措施的效用。如果我只能说x.name="blah"x.phone="blahblah",那么在安全性方面阻止我说x=X.new(name => "blah", phone => "blahblah") 有什么用?为什么我应该担心将通常不会/不应该更改的内容保留在保护范围内?

标签: ruby-on-rails ruby attr-accessible


【解决方案1】:

attr_accessible 指定了应始终对批量分配开放的属性列表,因此如果您只想打开这些属性进行播种,那么这可能不是您想要的。

您可以在种子文件中做的一件事是对每个属性使用 setter 方法。例如:

admin = User.new do |u|
  u.name = "Foo"
  u.admin = true
end

admin.save!

【讨论】:

  • 好吧,很公平。这是否意味着我必须像这样写出每个条目,或者有没有办法遍历哈希来构建这些?
  • 您确实可以遍历哈希。像hash.each {|k, v| u.send("#{k}=", v) } 这样的东西应该可以工作。
  • 似乎可以解决问题。我想我仍然对 为什么 以这种方式工作感到有些困惑。当我的种子无法以种子.rb 文件似乎表明它们应该的方式输入时,我觉得我正在破解自己的代码。
猜你喜欢
  • 2012-05-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-20
  • 2010-10-31
  • 2016-12-13
  • 1970-01-01
  • 2011-12-20
相关资源
最近更新 更多