实施 has_secure_password 后的错误消息
Error message after implementing has_secure_password
我在 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 和附加列,但我收到此错误消息。有谁知道可能是什么原因?
您似乎已经修改并重新运行您现有的迁移。在这种情况下,您的测试数据库与您的开发数据库不同步。您需要将模式加载到测试数据库中:
rake db:test:prepare
解释:
在 rails 开发中,您有两个 完全独立的 环境 - 测试和开发。开发是您用来查看所写内容的环境 - 它是 rails s
和 rails c
的默认设置。测试环境仅用于测试。这些环境有两个独立的数据库。
直到最近,每次创建迁移时,您都必须 运行 两次,每个环境一次(因此两个数据库同步)或至少加载数据库架构以测试数据库。最新的 rails 版本稍微聪明一些 - 在 运行s 测试之前,它会检查是否所有迁移都已 运行,然后检查测试数据库的版本是否与开发数据库匹配。如果没有,它将从模式更新测试数据库。
由于您重新运行现有迁移,两个数据库生成相同的版本,因此您的测试数据库尚未自动更新,因此需要手动更新。
我在 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 和附加列,但我收到此错误消息。有谁知道可能是什么原因?
您似乎已经修改并重新运行您现有的迁移。在这种情况下,您的测试数据库与您的开发数据库不同步。您需要将模式加载到测试数据库中:
rake db:test:prepare
解释:
在 rails 开发中,您有两个 完全独立的 环境 - 测试和开发。开发是您用来查看所写内容的环境 - 它是 rails s
和 rails c
的默认设置。测试环境仅用于测试。这些环境有两个独立的数据库。
直到最近,每次创建迁移时,您都必须 运行 两次,每个环境一次(因此两个数据库同步)或至少加载数据库架构以测试数据库。最新的 rails 版本稍微聪明一些 - 在 运行s 测试之前,它会检查是否所有迁移都已 运行,然后检查测试数据库的版本是否与开发数据库匹配。如果没有,它将从模式更新测试数据库。
由于您重新运行现有迁移,两个数据库生成相同的版本,因此您的测试数据库尚未自动更新,因此需要手动更新。