2009-10-23 14 views
55

Właśnie zaktualizowałem swoje szyny do wersji 2.3.4 i zauważyłem to z walidacjami: Powiedzmy, że mam prosty model firmy, który ma nazwę. nic do tego. chcę uruchomić własną Walidacja:wywoływanie niestandardowych metod sprawdzania poprawności w Railsach

class Company < ActiveRecord::Base 

    validate :something 


    def something 
    false 
    end 

end 

oszczędność model faktycznie działa w tym przypadku. To samo stanie się, jeśli zastąpię validate() i zwrócę false. Zauważyłem to w bardziej złożonym modelu, w którym moja weryfikacja zwracała wartość false, ale obiekt wciąż był zapisywany ... Wypróbowałem go w zasadniczo pustym modelu i zastosowano to samo. Czy jest nowa praktyka, której mi brakuje? Nie wydaje się, żeby tak było w przypadku niektórych moich starszych kodów szyny.

+0

dziękuję. To prawie na pewno. Zakładam, że w nowym projekcie zapomniałem dodać błędy, a ze starszymi zdecydowanie je tam miałem. Duh. Dziękuję wam wszystkim. – cgr

Odpowiedz

107

Twoje sprawdzanie poprawności wykonywane jest przy użyciu metody validate. Jednak szyny nie opierają się na zwróconej wartości.

Opiera się na błędach walidacji lub nie. Powinieneś więc dodać błędy, gdy twój model nie sprawdza poprawności.

def something 
    errors.add(:field, 'error message') 
end 

Lub, jeśli błąd nie jest związany z polem:

def something 
    errors.add(:base, 'error message') 
end 

Wtedy twój model nie zostanie zapisany, ponieważ istnieją błędy.

+0

schludne, dziękuję! to jest pomocne – marcgg

+0

add_to_base nie jest już poprawny z Rails 3. Zobacz odpowiedź @ MagedMakled. – Undistraction

+0

Właśnie zaktualizowałem odpowiedź. Dziękuję Ci. –

14

Dajesz się mylić między walidacjami i oddzwanianiem.

Walidacje powinny zakończyć się niepowodzeniem, jeśli wystąpią jakiekolwiek błędy na obiekcie, nie ma znaczenia, co zwróci walidacja. Odwołania zwrotne nie działają, jeśli zwracają fałsz, niezależnie od tego, czy dodają jakieś błędy do obiektu.

Szyny używa połączeń są prawidłowe? z zapisanych połączeń, które nie sprawdzają wyniku jakichkolwiek sprawdzeń.

Edytuj: Prowadnice traktuje validate :method jako wywołanie zwrotne, ale ważne? nadal nie sprawdza ich wyników, tylko w przypadku błędów dodanych do obiektu.

Nie sądzę, że to zachowanie zmieniło się w ogóle, ale mogę się mylić. Nie sądzę, żebym kiedykolwiek napisał sprawdzanie poprawności, aby wcześniej zwracać fałsz.

+1

Próbowałem utworzyć sprawdzanie poprawności dla new_records, więc stworzyłem metodę użycia z callbackiem Obj.before_validation_on_create i dodałem kilka błędów podstawowych. Jednak obiekt zostałby utworzony, nawet jeśli mój wywołanie zwrotne spowodowało błąd podstawowy. To zadziałało tylko wtedy, gdy mój callback zwrócił "false", tak jak sugerowałeś! Dzięki za wskazanie, jak sprawić, aby wywołanie zwrotne nie powiodło się – Coderama

8

Wystarczy FYI errors.add_to_base('error message') została zaniechana w szynach 3, ale zastąpiono

errors[:base] << "Error message" 

Or

errors.add(:base, "Error message") 
Powiązane problemy