Пропустить проверку для некоторых членов в модели Devise во время сброса пароля - PullRequest
6 голосов
/ 06 февраля 2012

Модель My User (Devise) также имеет имя, город, нацию, телефонный номер.

На странице создания регистрации - I validates_presence_of city, nation, phone, name, email, :on => :create

На странице редактирования редактирования - I validates_presence_of city, nation, phone, name, :on => :update

Теперь, когда я устанавливаю новый пароль на странице Forgot_password_page, он запрашивает наличие города, страны, телефона, имени внутри Devise::PasswordsController#update

Как я могу обрабатывать выборочные проверки?

Я предполагаю, что это должно быть что-то вроде

validates_presence_of city, nation, phone, name, :on => :update, :if => :not_recovering_password

def not_recovering_password
  # what goes here
end

Ответы [ 4 ]

10 голосов
/ 30 марта 2016

У меня была похожая проблема, потому что при создании моего пользователя не все его поля обязательны для заполнения. Наличие других полей проверяется on: :update с использованием проверки.

Вот как я решил:

validates :birthdate, presence: true, on: :update, unless: Proc.new{|u| u.encrypted_password_changed? }

Метод encrypted_password_changed? используется в Devise Recoverable .

3 голосов
/ 06 июня 2014

Я сталкивался с этим вопросом в поисках ответа на аналогичный вопрос, так что, надеюсь, кто-то найдет это полезным.В моем случае я имел дело с унаследованными данными, в которых отсутствовала информация для полей, которые ранее не требовались, но были позже сделаны обязательными.Вот что я сделал, по сути, чтобы завершить приведенный выше код:


validates_presence_of city, nation, phone, name, :on => :update, :if => :not_recovering_password

def not_recovering_password
  password_confirmation.nil?
end

По сути, он использует отсутствие / присутствие поля password_confirmation, чтобы узнать, пытается ли пользователь изменить / сбросить свой пароль.Если он не заполнен, они не изменяют его (и, таким образом, запускают ваши проверки).Если он заполнен, то они меняются / сбрасываются, и, таким образом, вы хотите пропустить проверки.

2 голосов
/ 14 августа 2015

В модели Devise вы можете переопределить reset_password! и использовать свои собственные проверки.Например:

def reset_password!(new_password, new_password_confirmation)
  self.password = new_password
  self.password_confirmation = new_password_confirmation

  validates_presence_of     :password
  validates_confirmation_of :password
  validates_length_of       :password, within: Devise.password_length, allow_blank: true

  if errors.empty?
    clear_reset_password_token
    after_password_reset
    save(validate: false)
  end
end
1 голос
/ 09 февраля 2012

Получил ответ от Хосе - https://github.com/plataformatec/devise/issues/1623

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...