2015-06-05 14 views
6

'dan geçiyorsa, bir alanın varlığını doğrulamak istiyorum ve alan için değer yoksa bir hata iletisi döndürmek istiyorum. Daha sonra, bu varlık doğrulamasının geçtiğini varsayarak, bir içerme doğrulaması çalıştırmak istiyorum.Çalıştırma rayları yalnızca varlık varlığı

Şu anda var:

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

Ama sorun, yukarıdaki girişimleri ikisi için yokken değerdir: İki ayrı doğrulamaları içine bölme bu kadar çalıştık

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

şöyle segment_type alana dahil edilir, ben de yanıtlar için hata iletileri alıyorum:

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

Bu durumda, sadece ikinci ileti değil "Segment türü boş olamaz" istiyorum.

bu koşullu doğrulama yapmak ve bana özel bir işlev tanımlamak zorunda kalmadan bana hata iletileri istenen şelale vermek için raylar anlarsınız herhangi bir şekilde, sırayla bu koşulları denetler segment_type_presence_and_inclusion_check demek ve validate :segment_type_presence_and_inclusion_check ile çağırarak var mı? inclusion seçeneği içinde bir if içinde

cevap

6

geçişli bir de proc

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

mu içerme 'Bu sadece iş üzerine allow_blank kullanmak mümkün olmalıdır:'? Özel bir doğrulayıcı ile 'içerme 'yerine geçemiyorum ve bu yüzden aşağıdaki @ michael-discenza yöntemini kullanıyorum, ancak modele yalnızca bir kez (iki kere değil)' validates: 'çağrılarak mümkün olması gerektiğini hissediyor. –

+0

Hayır, diğer doğrulama yardımcılarıyla çalışmalıdır. Düzeltmeye çalıştığınız kod nedir? – jvnill

+0

'validates: başlık, varlık: true, length: {maximum: 255}' 'validates: başlık, generate_url: true, if: proc {| p | p.title.present? && p.title.length <= 255} ' Daha sonra' app/validators' içinde 'GenerateUrlValidator' var. –

0

bu kadar iyi çalışır keşfetti kullanabilirsiniz varlığı

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

private 

def segment_type_present? 
    segment_type.present? 
end 

kontrol etmek.

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

Ayrıca içerme doğrulama

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

Bu, işaretli yanıttan daha basit ve zariftir. FYI ayrıca bkz: allow_nil: true'. Bunların ilgili dokümanlar olduğunu düşünüyorum: http: // apidock.com/raylar/ActiveModel/Validations/ClassMethods/validates – s2t2

+0

'varlığı: true' burada beri gerekli değildir. Ayrıca, 'allow_blank''nın artık eklenmesinin * dışında * olması gerekiyordu: {} seçenekler karma. (Http://edgeguides.rubyonrails.org/active_record_validations.html#allow-nil) – MrYoshiji

İlgili konular