2011-03-22 94 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