在Rails中一切都帮你考虑到,比如在需要密码验证的model中加上如下一句:
has_secure_password
则会帮你自动创建密码,密码确认以及密码求散的逻辑,很好很强大!!!
不过有些情况下我们不希望这个默认的操作,比如用户在编辑自己的信息时,如果不修改密码,而直接点确认更新按钮,则表示密码不变.但是常规的验证是必须输入密码的!
@staff.update_attributes(staff_params)
上面一句肯定会失败,因为model中做了验证:
has_secure_password
VALID_PASSWORD_REGEX = /\A[^*\s]+\z/i
validates :password,length:{minimum:6}
validates :password,format:{with:VALID_PASSWORD_REGEX}
为了达到用户直接点击确认更新不更新密码的功能,我们需要做点调整,首先在edit的密码和密码确认框中输入一些非法字符,比如”*******”
然后在update逻辑中进行判断:
if @staff.errors.messages.count == 1 && @staff.errors.messages[:password] && params[:staff][:password] == "******"
params[:staff].delete(:password)
params[:staff].delete(:password_confirmation)
@staff.update_columns(staff_params)
flash[:success] = "#{@staff.name} 用户信息修改成功"
redirect_to @staff
return
end
如果用户没有输入密码,则跳过验证直接修改model!注意因为update_columns操作不会修改记录中的updated_at日期,所以还需要一个神奇的touch方法为你解忧:
@staff.touch