实现has_secure_password后出现错误消息

时间:2015-04-10 22:19:51

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

我在Rails中开发了一些工作正常的测试。然后我补充道:

  • 在模型文件中:has_secure_password
  • 在Gem文件中:gem' bcrypt',' 3.1.7' (在捆绑安装之后它出现在Gemfile.lock中)
  • 我将password_digest作为字符串添加到迁移文件中(迁移后它确实显示在schema.rb中)

我在测试文件中添加了密码和password_confirmation进行设置:

  def setup
    @user = User.new(email: "user@example.com",
                     username: "example user",
                     firstname: "Allan",
                     location: "Europe",
                     password: "foobar", 
                     password_confirmation: "foobar")
  end

现在,当我运行rake test时,我收到错误消息:

NoMethodError: undefined method 'password_digest=' for #<User:0x00000002f9c020> test/models/user_test.rb:6:in 'setup'.

第6行是指@ user = User.new ...

所以它似乎已正确实现了gem和其他列,但我收到此错误消息。有没有人知道可能是什么原因?

1 个答案:

答案 0 :(得分:1)

您似乎已修改并重新运行现有迁移。在这种情况下,您的测试数据库与您的开发数据库不同步。您需要使用以下命令将架构加载到测试数据库中:

rake db:test:prepare

说明:

在rails开发中,您有两个完全独立的环境 - 测试和开发。开发是您用来查看所写内容的环境 - 它是rails srails c的默认设置。测试环境仅用于测试。这些环境有两个独立的数据库。

直到最近,每次创建迁移时,都必须运行两次,每个环境运行一次(因此两个数据库都处于同步状态)或者至少加载数据库模式以测试数据库。最新的rails版本稍微聪明一点 - 在运行测试之前,它将检查是否已运行所有迁移,然后测试数据库的版本是否与dev数据库匹配。如果没有,它将从架构更新测试数据库。

由于您重新运行现有迁移,因此两个数据库都生成相同的版本,因此您的测试数据库尚未自动更新,因此需要手动更新。