2009-11-04 9 views
11

Mam model użytkownika z typowymi atrybutami, takimi jak adres e-mail i hash_hasło itp. Chcę napisać sprawdzanie poprawności, które sprawdza obecność adresu e-mail, ale tylko wtedy, gdyRails Walidacja wiadomości e-mail użytkowników - wymaga potwierdzenia, gdy użytkownik zarejestruje się lub aktualizuje adres e-mail

1) nie ma jednej przechowywane w bazie danych dla tego obiektu (czyli jest to nowy użytkownik logując się)

2) użytkownik próbuje aktualizować swój adres e-mail .

Moje obecne validations

validates_presence_of :email 
    validates_presence_of :email_confirmation 

    validates_confirmation_of :email 

są oczywiście zapobieganie mnie z aktualizacją żadnych atrybutów. Pomyślałem o użyciu

validates_presence_of: email,: if: email_validation_required?

def email_validation_required? 
self.email.blank? 
end 

Ale to przyzwyczajenie pomoc w scenariuszu 2, ponieważ będzie ona zwróci true, ponieważ użytkownik nie posiada hasło adres e-mail w db.

Nie mogę się dowiedzieć, jak mogę ograniczyć to tylko do tych dwóch scenariuszy powyżej.

Czy ktoś może pomóc?

Odpowiedz

18

Myślę, że EmFi jest na coś. Ale nie sądzę, żeby validates_presence_of :email cię trzymał. email powinien zawsze być obecny - jeśli pozostanie pusty w formularzu, parametr nie będzie bałagan ze składem użytkownika. Jeśli zostanie wprowadzony w formularzu, nawet w celu aktualizacji, powinien on mieć numer email_confirmation wzdłuż trasy.

spróbuj tego:

validates_presence_of :email 
validates_presence_of :email_confirmation, :if => :email_changed? 

validates_confirmation_of :email 
+0

Przepraszam za spóźnioną odpowiedź barry, twoja prawica nie trzyma mnie. Właśnie replikowałem kod dla password_confirmation dla email_confirmation ale to ma różne wymagania. Dziękuję za wskazanie. – robodisco

10

masz dwie opcje. jednym jest użycie :on. Domyślnie są one ustawione na , ale można coś zrobić jak ten

validates_presence_of :email, :on => :create 

lub

validates_presence_of :email, :on => :update 

inne opcje jest użycie :if, a następnie przechodzą w nazwie metody lub proc . więc coś

validates_presence_of :email, :if => :should_validate 

lub

validates_presence_of :email, :if => Proc.new { |user| user.signup_stage > 2 } 

nadzieję, że pomoże :)

+0

hi matt dzięki za pomóc. Myślałem o używaniu metody: jeśli, ale wpadłem na pomysł, jak napisać w sobie logikę. Zastanawiałem się, czy istnieje sposób, bez konieczności wprowadzania więcej atrybutów do mojego modelu. Zauważam w twoim ostatnim przykładzie, że wspomniałeś atrybut signup_stage. – robodisco

+0

Po prostu dawałem raczej ogólne przykłady. Po ponownym przeczytaniu pytania, dlaczego wiadomość e-mail będzie pusta w modelu, jeśli użytkownik ma hasło w bazie danych? –

+0

Przepraszam, że hasło było literówką - powinno przeczytać e-mail. Edytował post. – robodisco

3

chcesz użyć: czy klauzula w sprawie walidacji, który używa ActiveRecord :: Brudny metod:

validates_presence_of :email, :if => Proc.new { |user| user.email_changed?} 

NB Działa tylko w Rails 2.1 lub nowszym.