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?
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
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
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