2010-11-23 50 views
1

我有一個控制器,我想包括一些標準方法。Rails 3在控制器內嵌套模塊

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

uninitialized constanct MyModule::ClassMethods::InstanceMethods

我的模塊看起來是這樣,這也是錯誤的,原本意味着一個模型。這樣做的最好方法是什麼,以便我可以在控制器中使用它?

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 

回答

4

使用extend而不是include您ClassMethods。你也應該拆分模型和控制器模塊:

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 

模型則是這樣的:

class Model < ActiveRecord::Base 
    acts_as_something 
end 
+0

本文由耶胡達·卡茨進入到更詳細的關於爲什麼只用延長是不是覆蓋更好包括擴展:http://yehudakatz.com/2009/11/12/better-ruby-idioms/ – jergason 2010-11-23 19:29:58