Rails API - 设计:在用户更新时更新密码
Rails API - Devise: Update password on User update
我在尝试编辑用户密码时遇到了一个非常奇怪的设计问题 - 这是我目前正在做的事情的简化版本:
def update
user = User.find(params[:id])
password = params.delete(:password)
password_confirmation = params.delete(:password_confirmation)
if password.present? and password != "" and password == password_confirmation
user.password = password
end
user.update(params)
user.save
render json: user
end
真正奇怪的是,如果我将密码设置为任意字符串,通过将
password = "testpassword"
以上
user.password = password
可以正常使用,密码设置为"testpassword",我可以正常使用它登录。但是如果我尝试像上面的代码一样使用参数,我将无法使用 params[:password] 中设置的密码登录。我试过强制对字符串进行编码,并使用 user.update_without_password,但无济于事。
有人对此有任何想法吗?这让我发疯!
这里是参数散列的转储:
{"username"=>"testytest",
"first_name"=>"Test",
"last_name"=>"testy",
"password"=>"password",
"password_confirmation"=>"password"}
更准确地说,在这被触发后尝试登录导致我无法使用旧密码或新密码登录。如果有办法查看该函数中保存了哪个密码,我应该可以调试它!
好吧,经过 3 天的努力,我终于想出了一个解决方案,但是它很丑陋:我所做的是这个(我在用户模型中添加了一个方法来简化):
def update_password(new_password)
password_forced = ""
new_password.each_byte do |byte|
password_forced << byte.chr
end
self.password = password_forced
self.save
end
同样,检查来自参数的字符串并没有指出任何可能与另一个 ruby 字符串不同的地方...但无论如何,这有效!
我在尝试编辑用户密码时遇到了一个非常奇怪的设计问题 - 这是我目前正在做的事情的简化版本:
def update
user = User.find(params[:id])
password = params.delete(:password)
password_confirmation = params.delete(:password_confirmation)
if password.present? and password != "" and password == password_confirmation
user.password = password
end
user.update(params)
user.save
render json: user
end
真正奇怪的是,如果我将密码设置为任意字符串,通过将
password = "testpassword"
以上
user.password = password
可以正常使用,密码设置为"testpassword",我可以正常使用它登录。但是如果我尝试像上面的代码一样使用参数,我将无法使用 params[:password] 中设置的密码登录。我试过强制对字符串进行编码,并使用 user.update_without_password,但无济于事。
有人对此有任何想法吗?这让我发疯!
这里是参数散列的转储:
{"username"=>"testytest",
"first_name"=>"Test",
"last_name"=>"testy",
"password"=>"password",
"password_confirmation"=>"password"}
更准确地说,在这被触发后尝试登录导致我无法使用旧密码或新密码登录。如果有办法查看该函数中保存了哪个密码,我应该可以调试它!
好吧,经过 3 天的努力,我终于想出了一个解决方案,但是它很丑陋:我所做的是这个(我在用户模型中添加了一个方法来简化):
def update_password(new_password)
password_forced = ""
new_password.each_byte do |byte|
password_forced << byte.chr
end
self.password = password_forced
self.save
end
同样,检查来自参数的字符串并没有指出任何可能与另一个 ruby 字符串不同的地方...但无论如何,这有效!