我已經創建了一個應該接受相同數據格式(字符串,但可以是任何內容,FWIW)的幾個字段的模型。我想將相同的驗證規則應用於所有這些字段。當然,我可以繼續複製/粘貼東西,但這會違反DRY原則,並且也是常識...Rails 3:將相同的驗證規則應用於多個表字段
我想這個很容易,但我是一個Rails新手/時髦,所以excuse-moi爲一個微不足道的問題。 =)
我已經創建了一個應該接受相同數據格式(字符串,但可以是任何內容,FWIW)的幾個字段的模型。我想將相同的驗證規則應用於所有這些字段。當然,我可以繼續複製/粘貼東西,但這會違反DRY原則,並且也是常識...Rails 3:將相同的驗證規則應用於多個表字段
我想這個很容易,但我是一個Rails新手/時髦,所以excuse-moi爲一個微不足道的問題。 =)
所以,如果你有說三場驗證:
: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。
如果你使用任何內置的驗證(存在,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/
使用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
在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
是的,但是更奇特的東西呢,比如正則表達式比賽呢? – aL3xa 2012-03-20 20:54:32
我意識到這是多麼愚蠢/簡單。對不起,謝謝! =) – aL3xa 2012-03-20 20:55:04
沒問題!我也提前並附上了一些細節/資源。如果您已將此答案作爲解決方案發現,請點擊我帖子旁邊的圖標以「接受」該答案。這將表明問題已關閉,您對我的幫助感到滿意。 與學習軌道祝你好運! – 2012-03-20 21:01:56