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 字符串不同的地方...但无论如何,这有效!