У меня есть работая валидация на моей модели пользователя. Но поскольку мы обнаружили, что пользователи склонны сдаваться во время своей длинной регистрационной формы, мы разделили регистрационную форму на шаги, чтобы пользователь мог отказаться в любое время и все еще использовать сайт.Проблемы с проверкой в рельсах
У меня возникли проблемы с первым шагом регистрации пользователей с проверками. Вот соответствующий бит моей модели пользователя:
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 работает как шарм. Есть ли другой способ выполнить это или что-то, что я сейчас делаю неправильно с моим кодом?
спасибо Джейкоб. Глупо мне, глядя на него некоторое время. Не видел этого. – London