2014-01-02 4 views
0

У меня есть работая валидация на моей модели пользователя. Но поскольку мы обнаружили, что пользователи склонны сдаваться во время своей длинной регистрационной формы, мы разделили регистрационную форму на шаги, чтобы пользователь мог отказаться в любое время и все еще использовать сайт.Проблемы с проверкой в ​​рельсах

У меня возникли проблемы с первым шагом регистрации пользователей с проверками. Вот соответствующий бит моей модели пользователя:

with_options :if => lambda { |u| u.current_step == "get_started" } do |user| 
    user.validates :firstname, presence: true, length: { maximum: 50 } 
    user.validates :surname, presence: true, length: { maximum: 50 } 
    user.validates :email, presence: true, 
       format:  { with: VALID_EMAIL_REGEX } 

    user.validates :password_digest, presence: true 
    user.validates :password, length: { minimum: 6 } 
end 

Эта проверка работает отлично. Однако теперь мы добавили facebook, чтобы можно было войти в систему с помощью facebook, и у нас есть скрытые поля в нашей форме facebook_uid. Поэтому я хочу проверить пароль только в том случае, если эти поля равны нулю.

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

with_options :if => lambda { |u| u.current_step == "get_started" } do |user| 
    user.validates :firstname, presence: true, length: { maximum: 50 } 
    user.validates :surname, presence: true, length: { maximum: 50 } 
    user.validates :email, presence: true, 
     format:  { with: VALID_EMAIL_REGEX } 

    with_options :if => lambda { |u| u.facebook_uid.nil? } do |user| 
    user.validates :password_digest, presence: true 
    end 

    with_options :if => lambda { |u| u.user.password_digest_changed? && !u.password.nil? } do |user| 
    user.validates :password, length: { minimum: 6 } 
    end 
end 

или встроенный (соответствующий пароль только часть):

не
user.validates :password_digest, presence: true, if: lambda { |u| u.facebook_uid.nil? } 
user.validates :password, length: { minimum: 6 }, if: lambda { |u| u.user.password_digest_changed? && !u.password.nil? } 

Ни один из них работал на меня, что бы я ни пытался я получите эту ошибку:

undefined method `user' for #<User:0x00000008e924a8> 

Опять же, если я удаляю ifs и lambdas работает как шарм. Есть ли другой способ выполнить это или что-то, что я сейчас делаю неправильно с моим кодом?

ответ

1

В вашей password проверке лямбды, вы звоните

u.user.password_digest_changed? && !u.password.nil? 

т.е. вы отправляете метод user к u объекту, который является вашим User экземпляром. Этот объект не отвечает на user. Вы, вероятно, просто хотите

u.password_digest_changed? && !u.password.nil? 
+0

спасибо Джейкоб. Глупо мне, глядя на него некоторое время. Не видел этого. – London

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