【问题标题】:RSpec tests failing with 'unknown attribute'RSpec 测试因“未知属性”而失败
【发布时间】:2012-08-19 08:13:58
【问题描述】:

我正在测试我的模型中的属性响应:

it { should respond_to(:password) }
it { should respond_to(:password_confirmation) }

这些属性不是数据库的一部分,只是在我的模型中声明为attr_accessible。当我不声明它们并运行我的测试时,我得到:

ActiveModel::MassAssignmentSecurity::Error:
  Can't mass-assign protected attributes: password, password_confirmation

但在我声明它们之后,我得到:

ActiveRecord::UnknownAttributeError:
  unknown attribute: password

知道为什么会这样吗?

【问题讨论】:

  • 你选错了答案 =/

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


【解决方案1】:

@8vius 因为您正在按照教程进行操作,但还不够密切。 您需要添加以下行:

has_secure_password

下面 attr_accessible :email, :name, :role, :password, :password_confirmation

这允许您将纯文本密码和 password_confirmation 保存到内存中,以便您可以在加密和保存到数据库之前比较字符串并强制相等。您不想将密码以纯文本形式保存在数据库中。

【讨论】:

  • 你的答案应该是被选中的
【解决方案2】:

attr_accessible 告诉 Rails 你允许对属性进行所谓的批量赋值。

但属性必须存在于db中,否则你应该创建getter/setter,最简单的方法是:

attr_accessor :password_confirmation, :password

不管怎样,你不存储密码听起来很奇怪。

【讨论】:

  • 我确实存储了它,但那不是属性,我正在关注教程ruby.railstutorial.org
  • 刚看了一下,好像缺少attr_accessor声明
  • 是的,是的,现在可以了,他一定是在教程中错误地跳过了它,或者出于某种原因。
  • 你看,这是大多数书籍和教程中没有正确解释的事情之一(我认为)。谢谢你的回答!我不知道 attr_accessible 仅适用于数据库中已经存在的变量。我认为它是 Rails 中类的组合 getter/setter,有点语法糖!
  • @8vius 仔细阅读其他答案,以便您了解该问题的实际情况。我知道它已经解决了,但检查不正确的答案对未来的访问者不利;)在教程中你有一个明确的解释:ruby.railstutorial.org/chapters/…
猜你喜欢
  • 1970-01-01
  • 2018-03-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-08
相关资源
最近更新 更多