设计:如何从db获取用户密码

时间:2014-02-23 15:02:23

标签: ruby-on-rails-4 devise

我正在为用户登录编写黄瓜测试。

我有这样的场景背景,将用户添加到数据库

User.create!(

    :email => email,

    :password => password,

    :password_confirmation => password

    )

那么,为什么在我的顺序步骤中,我得到@ user.password nil?

  @user = User.find_by :email => "some@email.com"

  ...

  fill_in('Email', :with => @user.email)

  fill_in('Password', :with => @user.password)
  ...

2 个答案:

答案 0 :(得分:6)

Devise最初通过加密来存储原始密码。 encrypted_password(模型中的字段名称)存储在数据库中。

现在,当您致电User.find_by :email => "some@email.com"时,password字段不存在。password不是模型用户中的字段。它是模型中存在的实例变量,仅在您提交login/sign up表单时设置。在您的情况下,您尝试在log in之前访问密码字段,因此,未设置实例变量,并且您将password设为nil。

如果您需要更多详细信息,可以查看Devise password

的实际实施情况

答案 1 :(得分:1)

查看devise cucumber test维基页面了解更多信息。

正如Kirti指出的那样,您无法在用户模型中访问密码作为属性,特别是不能以纯文本形式访问。

如果您正在测试登录,请将密码字段保留为变量,或者在该测试中创建用户。

Given /^I am a new, authenticated user$/ do
  email = 'testing@man.net'
  password = 'secretpass'
  User.create!(
    :email => email,
    :password => password,
    :password_confirmation => password
  )

  visit '/users/sign_in'
  fill_in "user_email", :with => email
  fill_in "user_password", :with => password
  click_button "Sign in"

end

如果您确实需要稍后查找用户(@user = User.find_by)并填写密码,那么您需要将密码作为变量保留在测试范围之外。