[Rails] update_without_password不会更新用户信息

时间:2013-03-14 09:35:39

标签: ruby-on-rails devise

我执行了以下代码

  @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做些什么?

1 个答案:

答案 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'。