gpt4 book ai didi

ruby-on-rails - [Rails]update_without_password 不更新用户信息

转载 作者:行者123 更新时间:2023-12-03 16:19:31 31 4
gpt4 key购买 nike

我执行了以下代码

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

最佳答案

我刚刚解决了自己的问题。下面的代码应该像宣传的那样工作(在 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?”定义了私有(private)方法

def needs_password?(user, params)
(params[:user].has_key?(:email) && user.email != params[:user][:email])
|| !params[:user][:password].blank?
end

我的问题是我从“edit.html.erb”文件的表单中删除了“电子邮件”字段,所以“需要密码?”方法一直返回 true,因为 user.email 永远不会等于 nil。为了解决这个问题,我添加了一个检查 params[:user].has_key?(:email) 来查看散列中是否存在“email”。

FWIW,“update_without_password”与“update_with_password”的工作方式几乎相同,只是它在调用对象的“update_attributes”之前删除了“password”和“password_confirmation”参数,因此您不必这样做更多的东西。尝试向上游看一下,看看您是否真的在调用“update_without_password”。

关于ruby-on-rails - [Rails]update_without_password 不更新用户信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15405598/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com