2012-03-29 58 views
1

我正在使用ActiveSupport :: Concern,並且我知道有幾種方法可以將這些內容組織到/ app/model /關注文件夾中,以表示一般性問題,但如果我想要綁定關注/具體型號我也看到了一些辦法,並希望看到一些利弊Rails 3 - 關注模塊或類

class Alert < ActiveRecord::Base 
    include Shareable 

關注在/ app /模型警報文件夾

class Alert 
    module Shareable 
     extends ActiveSupport::Concern 

module Alert::Shareable 
    extends ActiveSupport::Concern 

module Alert 
    module Shareable 
     extends ActiveSupport::Concern 

不能確定是否有這樣做一個最好的辦法,或者我應該只使用模塊或類模塊。我知道這是微不足道的,他們都似乎工作,但在組織上不知道是否有最好的方法。謝謝!

回答

2

如果你的模型是Alert,你絕對不想要module Alert(#3)。 #1和#2基本相同,但更多的時候你會看到#2風格。

讓我進一步解釋一下。

module X::Y樣式只有在已定義X的情況下才有效。它說:「X下創建該模塊Y,我不在乎,如果X是一個類或模塊,就去做。

對於#3,因爲Alert已經被定義爲class,你會得到這個錯誤:TypeError: Alert is not a module

讓我知道如果你需要更多的澄清

+0

奧斯汀謝謝你,我已經得到了一個地步,我看到有三個使用,並不總是如100%,有一種方法。!這是一個瘋狂的使用方式,你已經爲我完美地清理了它,現在我正在做一個大規模的重構,我真的很喜歡理解事物的來龍去脈。再次感謝您的幫助! – bokor 2012-03-29 15:37:07

+0

沒問題。只要將類和模塊都視爲常量,並根據語義上的含義將它們嵌套在一起即可。類可以在模塊下,反之亦然。如果最終它可以共享其他事物是有意義的,那麼將它移動到命名空間的頂部。意思是,不要將它嵌入Alert中。乾杯。 – Austin 2012-03-29 20:40:31

+0

同意,我已經用第二種方式比較簡單了,即模塊Alert :: Shareable。如果您使用第一個類,即類模塊,那麼您會遇到由多個Alert定義混淆工具的地方。例如,Annotate gem會給出超類不匹配錯誤,並且不會註釋Alert模型。我在rails dev控制檯中也遇到了一些問題。也就是說,這兩種風格在正在運行的Rails應用中都能正常工作。 – Alric 2012-11-07 23:53:56