2015-06-05 12 views
6

Chcę najpierw sprawdzić poprawność obecności pola i zwrócić jeden komunikat o błędzie, jeśli nie ma wartości dla tego pola. Następnie, zakładając, że weryfikacja obecności przejdzie, chcę przeprowadzić walidację włączenia.Sprawdzanie poprawności włączania szyn bieżących tylko wtedy, gdy obecność przekazuje

Teraz mam:

validates :segment_type, presence: true, inclusion: { in: SEGMENT_TYPES } 

Próbowałem podział ten na dwa odrębne walidacji następująco:

validates :segment_type, presence: true 
validates :segment_type, inclusion: { in: SEGMENT_TYPES } 

Ale jest problem dla obu prób powyżej, gdy nie ma wartości jest zawarty w polu segment_type, otrzymuję komunikaty o błędach dla obu odpowiedzi:

Segment type can't be blank 
Segment type is not included in the list 

W tym przypadku chciałbym tylko, aby "Typ segmentu nie mógł być pusty", a nie druga.

Czy jest jakiś sposób, żebym mógł powiedzieć szynom, aby wykonały to warunkowe sprawdzanie poprawności i dać mi pożądaną kaskadę komunikatów o błędach bez konieczności definiowania niestandardowej funkcji, na przykład segment_type_presence_and_inclusion_check, która sprawdza te warunki w sekwencji i wywołuje je za pomocą validate :segment_type_presence_and_inclusion_check?

Odpowiedz

6

przejściu w if wewnątrz opcją inclusion celu sprawdzenia obecności

validates :segment_type, 
    presence: true, 
    inclusion: { in: SEGMENT_TYPES, if: :segment_type_present? } 

private 

def segment_type_present? 
    segment_type.present? 
end 

można również użyć proc

inclusion: { in: SEGMENT_TYPES, if: proc { |x| x.segment_type.present? } } 
+0

Czy to tylko praca z 'włączenia:'? Nie mogę zastąpić 'inclusion' z niestandardowym walidatorem, a więc używam poniższej metody @ michael-discenza, ale czuję, że powinno to być możliwe przez wywołanie' validates: 'w modelu tylko raz (raczej niż dwa razy). –

+0

nie powinno działać z innymi pomocnikami sprawdzania poprawności. jaki kod próbujesz naprawić? – jvnill

+0

'validates: title, obecność: true, length: {maximum: 255}' 'validates: title, generate_url: true, if: proc {| p | p.title.present? && p.title.length <= 255} ' Mam wtedy' GenerateUrlValidator' w 'app/validators'. –

0

odkryłem, że to działa tak samo.

validates :segment_type, presence: true 
validates :segment_type, inclusion: { in: SEGMENT_TYPES }, if: "segment_type.present?" 
5

Należy również mieć możliwość korzystania z allow_blank na walidacji włączenia

validates :segment_type, 
      presence: true, 
      inclusion: { in: SEGMENT_TYPES, allow_blank: true } 
+3

jest to prostsze i bardziej eleganckie niż zaznaczona odpowiedź. FYI zobacz także "allow_nil: true". Myślę, że są to odpowiednie dokumenty: http: // apidock.com/rails/ActiveModel/Validations/ClassMethods/validates – s2t2

+0

"Obecność: true" nie jest tutaj konieczna od tego czasu. Ponadto, 'allow_blank' ma teraz być * poza * z hash opcji' inclusion: {} '. (http://edgeguides.rubyonrails.org/active_record_validations.html#allow-nil) – MrYoshiji

Powiązane problemy