2

通过rails教程工作,被这个错误难住了。

尝试运行验证唯一性测试时出现上述错误。在我插入用户固定装置后,这些错误似乎突然出现。我不明白我做错了什么,因为我的用户模型肯定在 attr_accessible 行中定义了 :password ,即使它似乎说用户没有密码属性?无论如何,下面的相关代码行:

型号/用户:

attr_accessible :email, :password, :password_confirmation, :remember_me,
:first_name, :last_name, :profile_name
validates :profile_name, presence: true, uniqueness: true

固定装置/users.yml:

name:
first_name: "user1"
last_name: "user2"
email: "email.com"
profile_name: "user"
password: "pass"
password_confirmation: "pass"

用户测试.rb:

user.profile_name = users(:name).profile_name
4

4 回答 4

3

has_secure_password依赖于 BCrypt,它用于散列密码。您应该可以访问 BCrypt 内部装置。您也可以使用 ERB。使用此技术为已知密码创建密码哈希。

homer:
  first_name: "Homer"
  ...
  password_digest: <%= BCrypt::Password.create('donuts', cost: 4) %>

无需手动将 设置password_digest为您的灯具中的某个未知值,而是使用 BCrypt 为您选择的密码创建密码摘要。

现在,在您的测试中,您可以这样做:

test "homer logs in with correct password" do
  user = users(:homer)

  get '/login'
  assert_success :response

  post_via_redirect '/login', username: user.username, password: user.password

  assert_equal '/profile', path
  assert_not_nil session[:user_id]
  assert_equal user.id, session[:user_id]
end

影响加密速度,最快的cost是4。这有利于快速测试。

您会收到错误,因为passwordpassword_confirmation是由 添加的虚拟属性has_secure_password,并且未映射到数据库。该password_digest列存储密码的加盐和加密版本(称为摘要或哈希)。Fixtures 将属性映射到数据库列,因此如果您插入一个未映射到列的属性,您将得到一个 SQL 错误,就像您发现的那样。

于 2015-01-21T13:32:20.803 回答
2

我假设您正在关注 teamtreehouse 的 Treebook 示例,视频中建议的夹具无法工作,因为数据库中没有名为 password 或 password_confirmation 的列,它们是设计用来创建 encrypted_pa​​ssword 的字段。

因此,要使夹具正确,您必须像这样填充 encrypted_pa​​ssword 字段:

name:
 first_name: "Boat"
 last_name: "Love"
 profile_name: "Supahlovar"
 email: "love.boat@boats.org"
 encrypted_password = "$2a$10$8uCZ9wCTsFoqa0aIfpssne4qtchcpqhepdU5WylZwh4GBAkgFWEYe"

我认为您可以为加密密码使用任何值,但这就是您从数据库中检索加密密码时的样子。

于 2013-10-14T08:10:15.253 回答
0

它没有说用户没有密码属性,它说你的用户表在数据库中没有密码列(这是正确的,它不应该。)

如果没有看到您的其余代码(或不知道您的用户表的结构,请将这些添加到您的问题中),我猜您has_secure_password的模型中缺少一行。

于 2013-03-04T05:26:54.163 回答
-1

直到更新我会说:

  1. 通过迁移将密码列添加到数据库
  2. 然后运行rake db:migrate

(另外,如果您甚至没有测试数据库,也许您应该rake db:test:prepare先运行)

于 2013-03-04T05:31:14.730 回答