2012-03-29 41 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