2009-05-27 17 views
7

Pracuję nad aplikacją Rails, że istniejący użytkownicy mogą zapraszać dodatkowych członków do przyłączenia się. Problem polega na tym, że model użytkownika istnieje w różnych stanach iw różnych stanach, wymagane są różne zbiory informacji.Sprawdzanie w wielu stanach w Railsach

Na przykład John jest członkiem witryny i zaprasza Mary. John wprowadza imię i adres e-mail Mary, rekord użytkownika jest tworzony w bazie danych dla Mary, a wiadomość e-mail z zaproszeniem jest wysyłana. Jednak po dołączeniu wymagany zestaw zmian danych wymaga od niej podania dodatkowych informacji (np. Hasła).

wciąż się uczę Ruby on Rails i nie widzę żadnych sposób obsłużyć to przy użyciu standardowych technik walidacji validates_presence_of, validates_format_of, itd. Czy ktoś może wskazać mi w dobrym kierunku

Odpowiedz

9

Najłatwiej jest używać :if następująco:

class User < ActiveRecord::Base 
    validate_presence_of :name 
    validate_presence_of :age, :if => Proc.new { |user| user.signup_step >= 2 } 
    # ... etc 
end 

lub:

class User < ActiveRecord::Base 
    validate_presence_of :name 
    validate_presence_of :age, :if => :registering? 

    def registering? 
    signup_step >= 2 
    end 
end 

można również użyć validate meto d, aby zdefiniować złożoną, niestandardową logikę. Na przykład:

class User < ActiveRecord::Base 
    validate :has_name_and_email_after_invitation 
    validate :has_complete_profile_after_registration 

    def has_name_and_email_after_invitation 
    if ... # determine if we're creating an invitation 
     # step 1 validation logic here 
    end 
    end 

    def has_complete_profile_after_registration 
    if ... # determine if we're registering a new user 
     # step 2 validation logic here 
    end 
    end 
end 

(W powyższym przykładzie, można rzeczywiście określić reguły walidacji w has_name_and_email_after_invitation regularnych validates_xxx_of połączeń, ponieważ muszą one mieć zastosowanie w kroku 2, a także, ale za pomocą dwóch metod dla oddzielnych etapach daje maksymalna elastyczność)

+1

Dziękuję, że był to doskonały wyjaśnienie. – Jason

+1

Nadal bardzo dobra odpowiedź, trudno znaleźć cokolwiek w tej konkretnej sprawie. Budowałeś koszyk, a ta odpowiedź jest bardzo przydatna. –

5

A dla DRYin'up kodzie nieco, można użyć with_options coś takiego:.

class Example < ActiveRecord::Base 
    [...] 
    def registering? 
    signup_step >= 2 
    end 
    with_options(:if => :registering?) do |c| 
    c.validates_presence_of :name 
    end 

    with_options(:unless => :registering?) do |c| 
    c.validates_presence_of :contact_details 
    end 
    [...] 
end 

Dowiedz się więcej o with_options tutaj:

http://apidock.com/rails/v2.3.2/Object/with_options

Jest nawet screencast przez RailsCasts:

http://railscasts.com/episodes/42-with-options

Powiązane problemy