Ruby on rails 仅当存在通过时才运行rails包含验证
我想先验证一个字段是否存在,如果该字段没有值,则返回一条错误消息。然后假设此状态验证通过,我想运行包含验证 现在我有:Ruby on rails 仅当存在通过时才运行rails包含验证,ruby-on-rails,validation,Ruby On Rails,Validation,我想先验证一个字段是否存在,如果该字段没有值,则返回一条错误消息。然后假设此状态验证通过,我想运行包含验证 现在我有: validates :segment_type, presence: true, inclusion: { in: SEGMENT_TYPES } 我尝试将其分为两个独立的验证,如下所示: validates :segment_type, presence: true validates :segment_type, inclusion: { in: SEGMENT_TYPE
validates :segment_type, presence: true, inclusion: { in: SEGMENT_TYPES }
我尝试将其分为两个独立的验证,如下所示:
validates :segment_type, presence: true
validates :segment_type, inclusion: { in: SEGMENT_TYPES }
但上述两种尝试都存在问题,当段类型
字段中未包含任何值时,我会收到两种响应的错误消息:
Segment type can't be blank
Segment type is not included in the list
在这种情况下,我只希望“段类型不能为空”,而不是第二条消息
有没有什么方法可以让rails进行条件验证,并提供所需的错误消息瀑布,而无需定义自定义函数,说
section\u type\u presence\u和\u inclusion\u check
,按顺序检查这些条件,并用validate调用它:section\u type\u presence\u和\u inclusion\u check
?在inclusion
选项中传递if
,以检查是否存在
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? } }
我发现这也很有效
validates :segment_type, presence: true
validates :segment_type, inclusion: { in: SEGMENT_TYPES }, if: "segment_type.present?"
您还应该能够在包含验证中使用
allow_blank
validates :segment_type,
presence: true,
inclusion: { in: SEGMENT_TYPES, allow_blank: true }
这是否仅适用于
包含:
?我似乎无法用自定义验证器替换inclusion
,因此我使用下面的@michael discenza方法,但我觉得应该可以只对模型调用一次validates:
,而不是两次。它不应该与其他验证助手一起工作。你想修改的代码是什么?validates:title,presence:true,length:{maximum:255}
validates:title,generate_-url:true,if:proc{p | p.title.present?&&p.title.length啊..不确定。以前从未有过这样做的机会。你是否已经尝试过validates:title,generate_-url:{if:proc{| p | p.title.present?}
Rails生成一个带有属性名+问号的方法来测试值的存在。因此,您可以简单地执行segment\u type?
,这与segment\u type相同。呈现?
这比标记的答案更简单、更优雅。仅供参考allow\u nil:true
。我认为这些是相关的t文档:presence:true
在这里是不必要的,因为。另外,allow\u blank
现在应该在inclusion:{}
options散列之外。()事实上,SEGMENT\u类型看起来像是用于枚举的整数字段,因此allow\u nil是要使用的选项,instad of allow\u blank。