Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 仅当存在通过时才运行rails包含验证_Ruby On Rails_Validation - Fatal编程技术网

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。