2010-11-23 4 views
1

Ich habe einen Controller, den ich einige Standardmethoden einschließen möchte.Schienen 3 Einschließlich verschachtelte Module im Controller

class Main::UsersController < Main::BaseController 
    include MyModule::ControllerMethods 
end 

uninitialized constanct MyModule::ClassMethods::InstanceMethods

sieht mein Modul wie diese, die auch falsch ist, und wurde für ein Modell ursprünglich gedacht. Was ist der beste Weg dies zu tun, damit ich es auch mit einem Controller benutzen kann?

module MyModule 
    def self.included(base) 
    base.has_one :example, :autosave => true 
    base.before_create :make_awesome   

    base.extend ClassMethods 
    end 

    module ClassMethods 
    ... 
    include InstanceMethods 
    end 

    module InstanceMethods 
    ... 
    end 

    module ControllerMethods 
    ... 
    # I want to include these in my controller 
    def hello; end 
    def world; end 
    end 

end 

Antwort

4

Verwenden extend statt include für Ihren Class. Sie sollten auch Split Ihr Modell und Controller-Module:

module MyModule  
    module ModelMethods 
    def acts_as_something 
     send :has_one, :example, :autosave => true 
     send :before_create, :make_awesome 
     send :include, InstanceMethods 
    end 
    module InstanceMethods 
     ... 
    end 


    end 

    module ControllerMethods 
    ... 
    # I want to include these in my controller 
    def hello; end 
    def world; end 
    end 

end 

ActiveRecord::Base.extend MyModule::ModelMethods 

Ihr Modell würde dann wie folgt aussehen:

class Model < ActiveRecord::Base 
    acts_as_something 
end 
+0

Dieser Artikel von Yehuda Katz in mehr Detail geht, warum nur verlängern mit besser als zwingende enthalten, um zu erweitern: http://yehudakatz.com/2009/11/12/better-ruby-idioms/ – jergason

+0

Nur neugierig, Sie setzen 'Base.extend MyModule :: ModelMethods', aber was" Base "betrifft. Sollte es "ActiveRecord :: Base" sein? – Dex

+0

Ich dachte, ich würde es mit 'Base' einfach halten, aber es ist wahrscheinlich verwirrender. Ich habe die Antwort geändert, um 'ActiveRecord :: Base' zu ​​verwenden –