如果用户记录包含无效数据,Rails devise重置密码将失败

时间:2018-08-13 11:35:00

标签: ruby-on-rails devise passwords

我在生产中已有一个应用程序,我们在用户记录中添加了新的必填字段。结果,忘记密码功能失败。我相信失败发生在以下方法的recoverable.rb

  # Update password saving the record and clearing token. Returns true if
  # the passwords are valid and the record was saved, false otherwise.
  def reset_password(new_password, new_password_confirmation)
    if new_password.present?
      self.password = new_password
      self.password_confirmation = new_password_confirmation
      save
    else
      errors.add(:password, :blank)
      false
    end
  end

不能自动生成新属性。只有用户本人才能知道正确的值。有人知道解决这个问题的方法吗?

到目前为止,我唯一想到的想法是:

  • 使用rake脚本用我知道在现实生活中不会出现但会被模型验证规则接受的值填充新字段

  • 当用户登录时,检测用户记录是否包含无效数据并强制他们进行更新。在用户编辑表单中,我将使用一些javascript将伪造的值更改为空白。

1 个答案:

答案 0 :(得分:0)

您可以使用自定义验证上下文来确保对这些添加字段的验证仅在用户编辑其个人资料时运行,而在(例如)Devise保存用户记录时跳过。 / p>

在用户模型中,为这些验证添加on:条款

validates_presence_of :recently_added_mandatory_field, on: :user_updates_profile

并在适当的控制器操作中,在调用#valid?#save时添加此验证上下文:

# Existing code uses `@user.valid?` -> change to:
if @user.valid?(:user_updates_profile)
  …

# Existing code uses `@user.save` -> change to:
if @user.save(context: :user_updates_profile)
  …

请参阅此处以获取验证上下文的完整说明:https://api.rubyonrails.org/classes/ActiveModel/Validations/ClassMethods.html#method-i-validates