Rails模型属性允许为零但在没有时进行验证

时间:2016-05-25 07:59:09

标签: ruby-on-rails

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

  1. 如果没有?然后保存成功,没有错误
  2. 如果不是零?然后验证其格式
  3. 我在这里有一个简单的界限:

    public static void main(String[] args) {
        List<Integer> list = Arrays.asList(1,2,3,4,5,6,7);
        Observable.from(list)
                .map(new Func1<Integer, String>() {
                    @Override
                    public String call(Integer integer) {
                        return   String.format("%d ",integer);
                    }
                }).subscribeOn(Schedulers.newThread())
                .observeOn(Schedulers.newThread())
                .subscribe(new Action1<String>() {
                    @Override
                    public void call(String s) {
                        System.out.print(s);
                    }
                });
    }
    

    这将适用于所有情况,但不会允许nil / empty值,因为它会抛出异常。但是:

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

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

    将允许nil / empty值但是如果输入无效,例如“33 @@@#$”然后返回“true”。

    我怎么能包括这两种情况?那可能吗 ?

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

2 个答案:

答案 0 :(得分:0)

试试这个

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

答案 1 :(得分:0)

Typecasting似乎是个问题。

以下解决方案运行良好:

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

我们最需要检查变量的值是否为空,然后再将其转换为inet(postgreSQL)。