2012-10-18 51 views
9

我正在使用Ruby on Rails 3.2.2。我正在實施一個模塊,並通過使用RoR ActiveSupport::Concern功能將其包含在我的課程中。它提供了included do ... end塊中的代碼,這些代碼在包含該模塊的類的類上下文中執行。「包含的do ... end」塊中不應包含哪些內容?

我的疑問是:我應該怎樣不是包含在included do ... end塊?也就是說,舉例來說,做出以下事情是否是一種「普通」/「好」做法?

module MyModule 
    extend ActiveSupport::Concern 

    class MyModuleClass 
    attr_accessor :attr1, :attr2, :attr3 

    def initialize(attrs) 
    @attr1 = attrs[:attr1] 
    @attr2 = attrs[:attr2] 
    @attr3 = attrs[:attr3] 
    end 
    end 

    included do 
    @my_module_class = MyModuleClass.new(some_attrs) 
    end 
end 

更多,將作爲在包括類的MyModule順便說一句一個屬性@my_module_class變量:我想使@my_module_class是「看得見」 內部到MyModule自它只打算在該模塊中使用)?是否有一些「高級」示例或教程來說明如何處理上述代碼的included do ... end塊中的實例?你有什麼建議?

回答

2

@my_class將是MyClass的一個實例,而不是MyModule。如果你想讓MyClass的所有實例成爲MyModule的實例,你應該寫:

include MyModule 

裏面的類定義。

我認爲我的回答是有道理的,如果你在編輯前查看這個問題的原始版本。

編輯1:

讓我們添加到您的例子,假設你有一個名爲Foo類:

class Foo 
    include MyModule 
end 

你想使一個與富,但相關MyModuleClass的實例聽起來你並不是真的想要修改Foo或者讓它訪問MyModuleClass。我建議你使用一個哈希表:

module MyModule 
    # ... 

    @hash = {} 
    class << self 
     attr_accessor :hash 
    end 

    included do 
     MyModule.hash[self] = MyModuleClass.new(some_attrs) 
    end 
end 

我認爲,將工作,而且避免了添加一個實例變量向Foo類對象。從技術上講,ruby代碼的任何部分都可以訪問MyModule.hash,但是您應該在源代碼中註釋,告訴人們不要這樣做,並且不要宣傳哈希存在。

+0

謝謝,但「主要」問題與「我應該*不包含在'包含的do ... end'塊中的內容有關嗎?」 *,例如*,與我的情況相關。其餘的是「更多」,即使它對我來說非常重要。但是,我並不希望將MyModuleClass的所有實例都作爲MyModule的一個實例,而只是將它們內部提供給MyModule。此外,類定義中的「包含MyModule」語句是隱含/顯而易見的,因爲模塊旨在包含在類中。 – user12882

+0

「我不該做什麼」的問題太模糊了,我不能真正回答,但請參閱上面的「編輯1」,我試圖解決您所問的問題。 –