2011-03-29 1 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