使用rails设计,调试(params)中不存在空密码字段?

时间:2012-08-19 20:26:24

标签: ruby-on-rails devise passwords params

我是铁杆和设计的新手,所以我试图了解发生了什么。我正在关注设计维基,允许用户编辑自己的密码,可在此处找到:https://github.com/plataformatec/devise/wiki/How-To:-Allow-users-to-edit-their-password

我觉得令人困惑的是,即使我正在使用:在我的模型中可验证,即使我将密码/ password_confirmation留空,我似乎能够提交表单,只要我完成current_password。这似乎与validatable.rb中的事实有关,即只有在!password.nil时才会验证密码? per line 54

所以我决定在表单提交上查看debug(params),看来确实如果我将密码/ password_confirmation字段留空,那么密码/ password_confirmation根本不会出现在params哈希中(虽然密码。没有?是真的吗?)。

我不明白为什么会发生这种情况?即使我将密码字段留空,也不应该像其他字段一样在密码中显示密码,如“password”=> “”?由于我正在使用自己的控制器操作来处理表单,因此密码如何不在params中?

1 个答案:

答案 0 :(得分:1)

该Wiki页面上使用的update_with_password方法导致您的混淆。如果它们为空白as seen here,它会从参数中删除passwordpassword_confirmation

这似乎是对wiki页面的疏忽,因为它描述了如何实现自己的更改密码操作。在这种情况下,这绝对是一个问题(提交“更改密码”表单而不填写密码可能会失败)。

无论如何,你可以解决它,并且仍然使用update_with_password方法,只需检查密码是否为空白,就像这样(根据你的意愿重构):

def update_password
  @user = User.find(current_user.id)

  if params[:user][:password].blank?
    @user.errors.add(:password, :blank)
    render "edit"
  elsif @user.update_attributes(params[:user])
    # Sign in the user by passing validation in case his password changed
    sign_in @user, :bypass => true
    redirect_to root_path
  else
    render "edit"
  end
end