2009-07-10 13 views
1

Ich habe das folgende ModulRuby on Rails - Teilen ein Verfahren mit zwei Modellen

module SharedMethods 

    # Class method 
    module ClassMethods 

     # 
     # Remove white space from end of strings 
     def remove_whitespace 
      self.attributes.each do |key,value| 
       if value.kind_of?(String) && !value.blank? 
        write_attribute key, value.strip 
       end 
      end 
     end 


    end 

    # 
    # 
    def self.included(base) 
     base.extend(ClassMethods) 
    end 

end 

und ich verwende es in meinen Modellen wie

include SharedMethods 
before_validation :remove_whitespace 

Allerdings, wenn ich das Formular abzuschicken ich bekommen "undefined Methode` remove_whitespace '"Nachricht

Was kann ich tun, um diesen Fehler zu beheben?

Antwort

2

Das liegt daran, :remove_whitespace muss eine Instanzmethode, keine Klassenmethode sein.

module SharedMethods 

    def self.included(base) 
    base.send :include, InstanceMethods 
    end 

    module InstanceMethods 

    # Remove white space from end of strings 
    def remove_whitespace 
     self.attributes.each do |key,value| 
     if value.kind_of(String) && !value.blank? 
      write_attribute key, value.strip 
     end 
     end 
    end 

    end 

end 

Wenn Sie das Modul benötigen sowohl Klassen- und Instanzmethoden zur Verfügung zu stellen, können Sie auch die Verwendung von self.included überspringen und Ihr Modul auf diese Weise vereinfachen:

module SharedMethods 

    # Remove white space from end of strings 
    def remove_whitespace 
    self.attributes.each do |key,value| 
     if value.kind_of(String) && !value.blank? 
     write_attribute key, value.strip 
     end 
    end 
    end 

end 
+0

Es wird andere Methoden sein in dieses Modul so möchte mit bleiben tun die oben self.included jetzt mit diesen Fehler private Methode Würfen '‚gehören für # genannt /Users/andy/rails_apps/test_app/vendor/rails/activerecord/lib/active_record/base.rb: 1964: in 'metho d_missing ' /Users/andy/rails_apps/test_app/lib/shared_methods.rb:7:in 'enthalten' –

+0

Privater Fehler kommt von base.include. Der direkteste Weg ist die Arbeit mit send: 'base .__ send __ (: include, InstanceMethods)' –

+0

Sie haben Recht. Sie sollten entweder send (: include, Module) oder class_eval {include Module} verwenden. –