2011-03-22 47 views
0

有没有一种方法只使用几行代码来验证输入字段?自定义验证,两行?

当我使用自定义验证时,我不得不这样做。

型号

class Search < ActiveRecord::Base 
    validates :email, :presence => true, :email => true 
end 

验证

class EmailValidator < ActiveModel::EachValidator 
    def validate_each(record, attribute, value) 
    record.errors[attribute] << (options[:message] || "is not an email") unless 
     value =~ /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\z/i 
    end 
    end 
end 

这是我真正想做的事情。

class Search < ActiveRecord::Base 
    validates :email, :email => lambda do |record, value| 
    record.errors[:email] << "invalid field" unless value =~ /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\z/i 
    end 
end 

这可能吗?

+0

我只是要在这里把这个... http://api.rubyonrails.org/classes/ActiveModel/Validations/ClassMethods.html#method-i-validates – 2011-03-22 12:43:52

+2

此外,验证应在你的模型上,而不是你的控制器。 – 2011-03-22 12:44:27

+0

@Beerlington要复制和粘贴,现在已经修复。 – Oleander 2011-07-06 08:10:13

回答

0

这里是我的解决方案。

class Search < ActiveRecord::Base 
    validate :my_custom_validator 

    def my_custom_validator 
    if @email.to_s.match(/hello/) 
     self.errors[:email] << "Email can't contain the word 'hello'" 
    end 
    end 
end 
0

看看加载ActiveModel的validates_format_of http://api.rubyonrails.org/classes/ActiveModel/Validations/HelperMethods.html#method-i-validates_format_of

class Person < ActiveRecord::Base 
    validates_format_of :email, :with => /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\Z/i, :on => :create 
end 

或使用快捷键:

class Person < ActiveRecord::Base 
    validates :email, :format => { :with => /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\Z/i, :on => :create } 
end 
+0

使用正则表达式只是一个例子。 – Oleander 2011-03-22 11:55:07