Отключение проверок при сбросе паролей в Devise / Warden - PullRequest
0 голосов
/ 17 января 2012

У меня есть пользовательская модель следующим образом:

class User < ActiveRecord::Base
  devise :database_authenticatable, :registerable, :invitable, 
    :recoverable, :rememberable, :trackable, :validatable, 
    :token_authenticatable, :omniauthable

  validates_presence_of :nickname, :unless => :skip_nickname_requirement
end

У меня есть несколько пользовательских записей в базе данных с нулевым псевдонимом - эти лица были импортированы из другой системы, и у меня фактически нет ихник.Этим пользователям предлагается установить свои пароли по ссылке потерянных паролей, например http://example.com/users/password/edit?reset_password_token=iAYeQRwWrt8geC8eEXR4, а затем, когда они войдут в систему, добавить свои личные данные, такие как псевдоним и т. Д.

Проблема заключается в том, что при переходе к этомусбросить пароль вам будет предложено ввести пароль (и снова для подтверждения).При отправке проверки происходит сбой, поскольку псевдоним равен nil.

Как отключить проверку псевдонима при сбросе пароля? Я не хочу добавлять текстовое поле псевдонима при сбросе пароляформа.

Заранее спасибо за ваши мысли!

1 Ответ

0 голосов
/ 18 января 2012

Я не знаю, решит ли ваша проблема простое validates_presence_of :nickname, allow_blank: true, потому что вы можете захотеть, чтобы оно было пустым только для импортированных пользователей.Поэтому другим способом было бы использовать пользовательские проверки.

# app/models/user.rb

class NicknameValidator < ActiveModel::EachValidator
  def validate_each(record, attribute, value)
    record.errors[attribute] << "validation failed" unless :skip_nickname_requirement?(value)
  end

  private

  def skip_nickname_requirement?(values)
    # imported_from_legacy_system? would need to be implemented
    value.present? || self.imported_from_legacy_system?
  end
end

class User < ActiveRecord::Base
  devise :database_authenticatable, :registerable, :invitable, 
     :recoverable, :rememberable, :trackable, :validatable, 
     :token_authenticatable, :omniauthable

  validates :nickname, :nickname => true
end
...