2012-03-20 70 views
14

我已經創建了一個應該接受相同數據格式(字符串,但可以是任何內容,FWIW)的幾個字段的模型。我想將相同的驗證規則應用於所有這些字段。當然,我可以繼續複製/粘貼東西,但這會違反DRY原則,並且也是常識...Rails 3:將相同的驗證規則應用於多個表字段

我想這個很容易,但我是一個Rails新手/時髦,所以excuse-moi爲一個微不足道的問題。 =)

回答

21

所以,如果你有說三場驗證:

:first_name 
:last_name 
:age 

你想他們都被驗證?因此,像這樣:

validates_presence_of :first_name, :last_name, :age 

編輯:有Rails中許多不同的驗證方法),他們是奇妙靈活)。對於字段的格式,您可以使用validates_format_of,然後使用正則表達式與之匹配。下面是匹配郵件的例子:

validates_format_of :email, :with => /^([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})$/i 

我檢查了Active Record Validations and Callbacks指南;它提供了有關Active Record在驗證方面提供的許多功能的全面信息。您也可以查看文檔here

+0

是的,但是更奇特的東西呢,比如正則表達式比賽呢? – aL3xa 2012-03-20 20:54:32

+0

我意識到這是多麼愚蠢/簡單。對不起,謝謝! =) – aL3xa 2012-03-20 20:55:04

+0

沒問題!我也提前並附上了一些細節/資源。如果您已將此答案作爲解決方案發現,請點擊我帖子旁邊的圖標以「接受」該答案。這將表明問題已關閉,您對我的幫助感到滿意。 與學習軌道祝你好運! – 2012-03-20 21:01:56

5

如果你使用任何內置的驗證(存在,length_of),你可以申請一個驗證多個屬性是這樣的:

validates_presence_of :name, :email 

如果有自定義的邏輯,你可以創建一個驗證器對象存放該代碼,並單獨應用它

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

def Person 
    validates :home_email, :email => true 
    validates :work_email, :email => true 
end 

見:http://thelucid.com/2010/01/08/sexy-validation-in-edge-rails-rails-3/

1

使用Themis此:

# Describe common validation in module 
module CommonValidation 
    extend Themis::Validation 

    validates_presence_of :foo 
    validates_length_of :bar, :maximum => 255 
end 

class ModelA < ActiveRecord::Base 
    # import validations 
    include CommonValidation 
end 

class ModelB < ActiveRecord::Base 
    # import validations 
    include CommonValidation 
end 
3

在Rails 4,你可以通過使用一個迴路採用同樣的驗證,以多列:

[:beds, :baths].each do |column| 
    validates column, allow_blank: true, length: { maximum: 25 } 
end 

兩個牀和浴室都使用相同的驗證驗證。

編輯:

在Rails 4.2,你可以通過把多個符號只會驗證函數調用後做同樣的事情。例如:

validates :beds, :baths, allow_blank: true 
相關問題