ruby-on-rails - 实现 has_secure_password 后出现错误消息

标签 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中)

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

  def setup
    @user = User.new(email: "<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="c9bcbaacbb89acb1a8a4b9a5ace7aaa6a4" rel="noreferrer noopener nofollow">[email protected]</a>",
                     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 和附加列,但我收到了此错误消息。有谁知道可能是什么原因吗?

最佳答案

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

rake db:test:prepare

说明:

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

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

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

关于ruby-on-rails - 实现 has_secure_password 后出现错误消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29571540/

相关文章:

ruby-on-rails - rails 3.2 : Routing helpers in views break locally after other error

ruby-on-rails - rails 电子邮件验证格式和正则表达式

html - 如何将 html.slim 转换为 html.erb?

mysql - 导轨 4 : can't save a record to db

ruby - 无法在 Windows xp 上的 cygwin 下为 bcrypt-ruby gem 构建 native 扩展

ruby-on-rails - Rails i18n : Translation missing problem, 语言环境未定义

ruby-on-rails - openshift 上的 rails 控制台

ruby-on-rails - 在 RSpec Controller 规范中使用不正确的密码模拟登录尝试引发 BCrypt::Errors::InvalidHash

ruby-on-rails - exception_notification gem 仅在 Heroku 生产模式下引发 ActionView::Template::Error (code converter not found (UTF-8 to UTF-16))

javascript - 在 Rails 助手中生成唯一标识符