2011-03-29 61 views
1

我想在一個單獨的類中實現before_validaton回調,以便它可以被多個模型類重用。Rails模型回調:將字段作爲參數傳遞給回調類?

在回調中,我想剝離字段作爲參數傳遞,但我不知道如何將參數傳遞給回調類。另外我想通過這個參考而不是價值(不知道這個概念是否在Ruby Rails中)。我下面的鏈接http://guides.rubyonrails.org/active_record_validations_callbacks.html#callback-classes

這裏是代碼這是不完全正確的,請於同一

class StripFieldsCallback 
    def self.before_validation(field) 
     field = field.strip 
    end 
end 

class User < ActiveRecord::Base 
    validates_uniqueness_of :name, :case_sensitive => false 
    validates_length_of :name, :maximum => 50 
    before__validation StripFieldsCallback(name) 
end 

幫助,如果我自己定義模型的方法,而不是單獨的回調類的代碼定義是這樣的(它工作得很好)

class User < ActiveRecord::Base 
      validates_uniqueness_of :name, :case_sensitive => false 
      validates_length_of :name, :maximum => 50 
      before__validation :strip_blanks 

      protected 
      def strip_blanks 
       self.name = self.name.strip 
      end 
    end 

當然,在所有模型中複製方法並不好,所以我想在回調類中定義方法。

回答

4

你可以做到這一點,或使用normalize_attributes gem

module StripFieldsCallback 
    def before_validation_z(field) 
    write_attribute(field, read_attribute(field).strip) if read_attribute(field) 
    end 
end 

class User < ActiveRecord::Base 
    include StripFieldsCallback 

    before_validation lambda{|data| data.before_validation_z(:name)} 
end