2013-08-22 26 views
0

我想擁有一個可以覆蓋默認驗證的默認驗證和子類的超類。從方法加載模型驗證?

class Foo < ActiveRecord::Base 
    FIELDS = [:field1, :field2] 
    after_initialize :include_rules 

    def include_rules 
    FIELDS.each do |field| 
     self.class.send(:validates, field, presence: true) 
    end 
    end 
end 

忽略將從超類繼承的子類...

每一個表單提交的時候,after_initialize被調用和驗證被複制。

I.e.提交表單4倍

輸出:

field1 can't be blank 
field1 can't be blank 
field1 can't be blank 
field1 can't be blank 
field2 can't be blank 
field2 can't be blank 
field2 can't be blank 
field2 can't be blank 

有沒有簡單的方法來驗證加載只有一次,但與調用他們的方法?

+0

'after_initialize'可能不是您想要的回調函數:每次找到並實例化對象時都會觸發它。也許你打算使用'before_create'或'before_save' – MrYoshiji

+0

使用before_create,before_validation和before_save時同樣存在問題。 – MichaelHajuddah

+0

爲什麼在初始化時定義這些驗證?您已經可以創建一個子類(繼承)並讓它們適用於子類。 – coreyward

回答

0

編輯:最終未使用此解決方案。

嗯,任何人都有比這更好的解決方案?

class Foo < ActiveRecord::Base 
    @@validations_ran = 0 
    FIELDS = [:field1, :field2] 
    after_initialize :include_rules 

    def include_rules 
    if @@validations_ran != 1 
     FIELDS.each do |field| 
     self.class.send(:validates, field, presence: true) 
     end 
     @@validations_ran = 1 
    end 
    end 
end 
0

也許你可以使用關注?

module Smoresable 
    extend ActiveSupport::Concern 

    included do 
    validates :marshamallow, presence: true 
    validates :graham, presence: true 
    validates :chocolate, presence: true 
    end 
end 

,並用它在你的「孩子」類像這樣:

class FooBar < ActiveRecord::Base 
    include Smoresable 
end 

對於您想自定義類,只需添加你需要的,如果列表足夠短..或者對其他驗證組合造成額外擔憂

0

我在錯誤的軌道上。這是我落得這樣做是我的最終解決方案:

class Foo < ActiveRecord::Base 
    self.abstract_class = true 
    self.table_name = "foos" 

    def self.defaults 
    include_fields 
    include_rules 
    end 

    def self.include_fields 
    store :custom_fields, accessors: self::FIELDS 
    end 

    def self.include_rules 
    self::FIELDS.each { |field| validates field, presence: true} 
    end 
end 

class SubFoo < Foo 
    FIELDS = [:bar, :bar1, :bar2] 
    defaults 
end 

現在我可以創建使用父默認驗證SubFoo情況下,我可以選擇包括或不包括。