2012-02-05 2 views
4

У моей модели User (Devise) также есть имя, город, страна, участники телефона.Пропустить проверку некоторых членов модели Devise во время сброса пароля

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

На странице редактирования регистрации - я 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 
+0

вы можете найти это - http://blog.devinterface.com/2011/05/two-step-signup-with-devise/ – Sairam

ответ

2

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


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

def not_recovering_password 
    password_confirmation.nil? 
end 

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

1

В модели 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 
7

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

Так вот как я решил:

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

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

+0

Могу ли я знать, как это работает? Что означает 'encrypted_password_changed?'? – prajwaldp

+0

Удивительно! Работает как шарм! :) –

Смежные вопросы