通过rails教程,我被这个错误难住了。
尝试运行验证唯一性测试时出现上述错误。这些错误似乎是在我插入用户fixture之后突然出现的。我不知道我做错了什么,因为我的用户模型确实在attr_accessible行中定义了:password,即使它似乎说users没有password属性?无论如何,下面的相关代码行:
型号/用户:
attr_accessible :email, :password, :password_confirmation, :remember_me,
:first_name, :last_name, :profile_name
validates :profile_name, presence: true, uniqueness: truefixtures/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发布于 2015-01-21 21:32:21
has_secure_password依赖于用于对密码进行哈希处理的BCrypt。您应该能够访问BCrypt inside fixtures。您也可以使用ERB。使用此技术可以为已知密码创建密码哈希。
homer:
first_name: "Homer"
...
password_digest: <%= BCrypt::Password.create('donuts', cost: 4) %>使用BCrypt为您选择的密码创建密码摘要,而不是在您的fixture中手动将password_digest设置为某个未知值。
现在,在您的测试中,您可以这样做:
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]
endcost会影响加密的速度,最快的是4,这对于快速测试是很好的。
您会得到一个错误,因为password和password_confirmation是由has_secure_password添加的虚拟属性,并且没有映射到数据库。password_digest列存储密码的加盐和加密版本(称为摘要或哈希)。Fixture将属性映射到数据库列,因此如果您插入一个没有映射到列的属性,您将得到一个SQL错误,就像您发现的那样。
发布于 2013-10-14 16:10:15
我假设你正在遵循teamtreehouse的Treebook示例,视频中建议的装置不能工作,因为数据库中没有名为password或password_confirmation的列,它们是devise用来创建encrypted_password的字段。
因此,要使fixture正确,您必须像这样填充encrypted_password字段:
name:
first_name: "Boat"
last_name: "Love"
profile_name: "Supahlovar"
email: "love.boat@boats.org"
encrypted_password = "$2a$10$8uCZ9wCTsFoqa0aIfpssne4qtchcpqhepdU5WylZwh4GBAkgFWEYe"我认为您可以使用任何值作为加密密码,但当您从数据库中检索加密密码时,它就是加密密码的样子。
发布于 2013-03-04 13:26:54
它并没有说User没有密码属性,而是说数据库中的users表没有password列(这是正确的,它不应该是这样的)。
在没有看到剩余代码的情况下(或者不知道users表的结构,请将它们添加到问题中),我猜您的模型中缺少has_secure_password行。
https://stackoverflow.com/questions/15195066
复制相似问题