我执行了以下代码
@user = User.find(current_user.id)
successfully_updated = if needs_password?(@user, params)
@user.update_with_password(params[:user])
else
# remove the virtual current_password attribute update_without_password
# doesn't know how to ignore it
params[:user].delete(:current_password)
@user.update_without_password(params[:user])
end
if successfully_updated
set_flash_message :notice, :updated
# Sign in the user bypassing validation in case his password changed
sign_in @user, :bypass => true
redirect_to after_update_path_for(@user)
else
render "edit"
end
但update_without_password给出false
并且数据库已回滚。
我是否必须为update_without_password做些什么?
答案 0 :(得分:3)
我刚刚解决了我自己的问题。以下代码应该像宣传的那样工作(可以在Devise的wiki页面上找到)。
def update
@user = User.find(current_user.id)
successfully_updated = if needs_password?(@user, params)
@user.update_with_password(params[:user])
else
params[:user].delete(:current_password)
@user.update_without_password(params[:user])
end
if successfully_updated
set_flash_message :notice, :updated
sign_in @user, :bypass => true
redirect_to after_update_path_for(@user)
else
render "edit"
end
end
确保您还为'needs_password?'
定义私有方法def needs_password?(user, params)
(params[:user].has_key?(:email) && user.email != params[:user][:email])
|| !params[:user][:password].blank?
end
我的问题是我从'edit.html.erb'文件中的表单中删除了“email”字段,所以'needs_password?'因为user.email永远不等于nil,所以方法保持返回true。为了解决这个问题,我在支票params[:user].has_key?(:email)
中添加了以查看哈希中是否存在“电子邮件”。
FWIW,'update_without_password'与'update_with_password'的工作方式基本相同,只是它在对象上调用'update_attributes'之前删除'password'和'password_confirmation'参数,所以你不应该这样做更多的东西。尝试向上游看一下,看看你是否真的在调用'update_without_password'。