我想首先验证字段是否存在,如果该字段没有值,则返回一条错误消息。然后假设此存在验证通过,我想运行包含验证。
现在我有:
validates :segment_type, presence: true, inclusion: { in: SEGMENT_TYPES }
我尝试将其拆分为两个单独的验证,如下所示:
validates :segment_type, presence: true
validates :segment_type, inclusion: { in: SEGMENT_TYPES }
但问题在于上述两种尝试,当segment_type
字段中没有包含任何值时,我会收到两个响应的错误消息:
Segment type can't be blank
Segment type is not included in the list
在这种情况下,我只想要"段类型不能为空白"而不是第二条消息。
有什么方法可以告诉rails进行这种条件验证并给我所需的错误消息瀑布,而不必定义自定义函数,比如segment_type_presence_and_inclusion_check
按顺序检查这些条件并调用它与validate :segment_type_presence_and_inclusion_check
?
答案 0 :(得分:9)
传入if
选项中的inclusion
以检查是否存在
validates :segment_type,
presence: true,
inclusion: { in: SEGMENT_TYPES, if: :segment_type_present? }
private
def segment_type_present?
segment_type.present?
end
您还可以使用proc
inclusion: { in: SEGMENT_TYPES, if: proc { |x| x.segment_type.present? } }
答案 1 :(得分:7)
您还应该能够在包含验证
上使用allow_blank
validates :segment_type,
presence: true,
inclusion: { in: SEGMENT_TYPES, allow_blank: true }
答案 2 :(得分:0)
我发现这也行得通。
validates :segment_type, presence: true
validates :segment_type, inclusion: { in: SEGMENT_TYPES }, if: "segment_type.present?"