2012-03-17 11 views
7

Używam Ruby (1.9.3) na Railsach (3.2.0) i mam problem z sprawdzaniem poprawności atrybutów wirtualnych.Sprawdzanie poprawności wirtualnych atrybutów w Ruby on Rails

Mam model , który reprezentuje lot, który między innymi ma atrybuty reprezentujące lotnisko wylotu i przylotu.

Ponieważ select za wybór lotniska jest potencjalnie ogromny, zdecydowałem się na rozwiązanie autouzupełniania, które działa idealnie dobrze. Używam before_validation zwrotnego poprawnie wypełnić rzeczywisty identyfikator lotniska:

before_validation do 
    self.departure_airport = Airport.find_by_long_name(departure_airport_name) 
    self.arrival_airport = Airport.find_by_long_name(arrival_airport_name) 
end 

Problemem jest jednak, że gdy użytkownik wprowadzi nazwę portu lotniczego, który nie istnieje w bazie danych, popełnić zawodzi ponieważ identyfikator każdego z portów lotniczych to nil. Wspaniały. Co nie jest świetne, jednak to, że to niepowodzenie walidacji nie odbija się na formie, bo technicznie, to wejście na innym polu:

validates :departure_airport, :arrival_airport presence: true 

attr_accessor :departure_airport_name, :arrival_airport_name 

<%= f.input :departure_airport_name %> 
<%= f.input :arrival_airport_name %> 

Czy to nawet sposób, aby prawidłowo chodzić, przekształcając nazwę lotniska do identyfikatora w oddzwanianiu before_validation? A jeśli tak, to w jaki sposób mogę uzyskać błędy sprawdzania poprawności w atrybucie nazwy wirtualnej lotniska?

Odpowiedz

4

Myślę, że idziesz właściwą drogą z oddzwanianiem before_validation.

Można sprawdzać atrybuty wirtualne, tak jak każdy normalny atrybut. Więc wszystko, czego potrzebujesz, to po prostu walidacja w modelu. Spróbuj tego:

validates :departure_airport, presence: true 
validates :arrival_airport, presence: true 

to powinno dodać błąd na błędy obiektów i powinien być wyświetlany błąd w formularzu ...

+0

Dzięki za szybką odpowiedź! Mam już sprawdzenia poprawności na 'departure_airport' i' arrival_airport'. Problem polega na tym, że nie są to pola, które reprezentują 'input' w formularzu. Nie mogę po prostu potwierdzić obecności, ponieważ gdy ktoś wpisuje w nich tekst, pole jest obecne, ale rzeczywisty obiekt "Airport" będzie nieobecny. – Laurens

+0

To dlatego rejestrujesz wywołanie zwrotne 'before_validation'. Kiedy użytkownik wejdzie w bełkot, nie znajdzie lotniska, a walidacja zawiedzie. Błąd zostanie dodany i wyświetlony użytkownikowi. Może powinieneś rozważyć dodanie niestandardowego masażu błędu. – klump

+0

Przepraszam, moje złe. Ja nie rozumiem. Może potrzebujesz własnej metody sprawdzania poprawności. Możesz dodać błędy do obiektu za pomocą 'self.errors.add (: nazwa pola," wiadomość ")'. Jeśli teraz użyjesz nazwy 'departure_airport_name' jako nazwy pola i dodasz wiadomość, zostanie ona wyświetlona w polu' departure_airport_name'. – klump