我想在两种情况下验证输入框值:
- 如果 nil?则保存成功,没有错误
- 如果不是 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) 之前检查变量的值是否为空。