在完成 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
fixtures/users.yml:
name:
first_name: "user1"
last_name: "user2"
email: "email.com"
profile_name: "user"
password: "pass"
password_confirmation: "pass"
user_test.rb:
user.profile_name = users(:name).profile_name
最佳答案
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。这有利于快速测试。
您会收到错误消息,因为 password
和 password_confirmation
是 has_secure_password
添加的虚拟属性,并且未映射到数据库。 password_digest
列存储密码的加盐和加密版本(称为摘要或哈希)。夹具将属性映射到数据库列,因此如果您插入未映射到列的属性,您将收到 SQL 错误,就像您发现的那样。
关于ruby-on-rails - 表 users 没有名为“password : INSERT INTO "users"”的列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15195066/