【问题标题】:Error message after implementing has_secure_password实施 has_secure_password 后的错误消息
【发布时间】:2015-04-10 22:19:51
【问题描述】:

我在 Rails 中开发了一些运行良好的测试。然后我补充说:

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

我在测试文件中添加了密码和密码确认设置:

  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 和附加列,但我收到了这个错误消息。有谁知道可能是什么原因?

【问题讨论】:

  • 您是创建了新的迁移还是修改了现有的迁移?
  • 我先运行bundle exec rake db:migrate VERSION=0,然后运行bundle exec rake db:migrate,但这没有帮助。
  • 它并没有真正回答我的问题,所以我假设您更改了现有的迁移。 :) 这将导致您的测试数据库与您的开发数据库不同步。运行 rake db:test:prepare - 它会将您当前的 schema.rb 加载到您的测试数据库中。
  • 解决了!还不知道为什么会这样,为什么我所做的还不够,但我会研究一下 rake db:test:prepare 究竟做了什么。
  • 请添加为答案

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


【解决方案1】:

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

rake db:test:prepare

解释:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-13
    • 1970-01-01
    • 1970-01-01
    • 2013-03-08
    相关资源
    最近更新 更多