0

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

我感到困惑的是,即使我在我的模型中使用 :validatable,只要我完成 current_password,即使我将 password/password_confirmation 留空,我似乎也可以提交表单。似乎这与在validatable.rb中只有在 !password.nil? 每行 54

所以我决定在提交表单时查看 debug(params) ,如果我将 password/password_confirmation 字段留空,那么 password/password_confirmation 根本不会出现在 params 哈希中(尽管 password.nil? 是真的?)。

我不明白为什么会这样?即使我将密码字段留空,密码是否不应该像任何其他字段一样出现在参数中,如“密码”=>“”?由于我使用自己的控制器操作来处理表单,所以密码不在参数中是怎么回事?

4

1 回答 1

1

update_with_passwordwiki 页面上使用的方法是造成您困惑的原因。如果它们是空白的,它会从参数中删除password和删除,如此处所示password_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
于 2012-08-20T02:16:38.247 回答