3

我执行了以下代码

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

4

1 回答 1

3

我刚刚解决了我自己的问题。以下代码应该像宣传的那样工作(如在设计的 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”文件的表单中删除了“电子邮件”字段,所以“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”。

于 2013-03-28T02:29:43.580 回答