5

na szynach 5.Rails - Walidacja: jeśli warunek jest spełniony

Mam Order model z atrybutem description. Chcę tylko sprawdzić jego obecność, jeśli spełniony jest jeden z dwóch warunków: jeśli bieżący krok jest równy pierwszemu krokowi LUB jeśli require_validation jest równy true.

mogę łatwo sprawdzić poprawność na podstawie jednego warunku jak ten:

validates :description, presence: true, if: :first_step? 

def first_step? 
current_step == steps.first 
end 

ale nie jestem pewien, jak go o dodanie kolejnego warunku i sprawdzenie, czy jeden lub drugi jest prawdziwe.

coś takiego:

validates :description, presence: true, if: :first_step? || :require_validation 

Dzięki!

Odpowiedz

7

Można użyć lambda dla klauzuli if: i zrobić lub stan.

validates :description, presence: true, if: -> {current_step == steps.first || require_validation} 
3

Czy można go po prostu owinąć w jedną metodę? Według docs

: jeśli - określa metodę, Proc lub ciąg zadzwonić w celu ustalenia, czy należy wystąpić walidacja (np jeżeli:: allow_validation, czy: Proc.new {| użytkownik | user.signup_step> 2}). Metoda, proc lub string powinny zwracać lub oceniać wartość true lub false.

validates :description, presence: true, if: :some_validation_check 

def some_validation_check 
    first_step? || require_validation 
end 
1

Jeśli nie chcesz, aby dodać jedną metodę jako Jared powiedzieć, to można spróbować zastosowanie lambda

validates :description, presence: true, if: ->{ first_step? || require_validation } 
2

można przekazać lambda zostać ocenione jako warunek if.

Spróbuj

validates :description, presence: true, if: -> { first_step? || require_validation }

+1

Czy to nie lambda? Blok będzie następujący: 'validates: description, presence: true, if: {first_step? || require_validation} ' –

+0

Ach, masz rację. Powinienem był powiedzieć "Możesz podać lambdę". –

+0

:) Blok działa również. Railsy po prostu konwertują je do proc lub lambda (zapomniałem co) przed użyciem. –