轨道模型属性允许 nil,但不允许时进行验证



我想在两种情况下验证输入框值:

  1. 如果 nil?则保存成功,没有错误
  2. 如果不是 nil?则验证其格式

我这里有一个简单的行:

validates :ip_addr, format: { with: Regexp.union(Resolv::IPv4::Regex)}

这在所有情况下都有效,但不允许 nil/empty 值,因为它会引发异常。但:

validates :ip_addr, format: { with: Regexp.union(Resolv::IPv4::Regex)}, allow_nil: true

validates :ip_addr, format: { with: Regexp.union(Resolv::IPv4::Regex)}, allow_blank: true

将允许零/空值,但如果输入无效,例如"33@@@#$",则返回"true"。

我怎样才能包括这两种情况?这可能吗?

编辑:似乎Regexp.union(Resolv::IPv4::Regex).match("something")返回 nil,所以如果验证以相同的方式工作,它将以错误的值返回 nil,allow_nil: true将允许它们像这样持久化。

试试这个

validates :ip_addr, format: { with: Regexp.union(Resolv::IPv4::Regex)}, if: :ip_addr

我不确定上述方法是否有效。如果没有,请执行此操作

validate :ip_addr_format_check, if: :ip_addr
def ip_addr_format_check
  unless ip_addr =~ Regexp.union(Resolv::IPv4::Regex)
    errors.add(:base, "Error you want to show")
  end
end

类型转换似乎是问题所在。

以下解决方案工作正常:

validates :ip_addr, format: { with: Resolv::IPv4::Regex }, 
    presence: false, unless: Proc.new { |ifc| ifc.ip_addr_before_type_cast.blank? }

很可能我们需要在将变量转换为 inet (postgreSQL) 之前检查变量的值是否为空。

最新更新