我是铁杆和设计的新手,所以我试图了解发生了什么。我正在关注设计维基,允许用户编辑自己的密码,可在此处找到: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中?
答案 0 :(得分:1)
该Wiki页面上使用的update_with_password
方法导致您的混淆。如果它们为空白as seen here,它会从参数中删除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