仅在存在通过

时间:2015-06-05 15:02:04

标签: ruby-on-rails validation

我想首先验证字段是否存在,如果该字段没有值,则返回一条错误消息。然后假设此存在验证通过,我想运行包含验证。

现在我有:

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

3 个答案:

答案 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?"