2013-04-11 70 views
17

我有我保存常量关注中:Rails的:包括以恒定的一个值得关注的一个关注

module Group::Constants 
    extend ActiveSupport::Concern 

    MEMBERSHIP_STATUSES = %w(accepted invited requested 
    rejected_by_group rejected_group) 
end 

而且我希望使用这些常量另一个问题:不幸的是

module User::Groupable 
    extend ActiveSupport::Concern 
    include Group::Constants 

    MEMBERSHIP_STATUSES.each do |status_name| 
    define_method "#{status_name}_groups" do 
     groups.where(:user_memberships => {:status => status_name}) 
    end 
    end 
end 

,这会导致路由错误:

uninitialized constant User::Groupable::MEMBERSHIP_STATUSES 

它看起来像第一关心的是不正确加载第二个问题。如果是这样的话,我能做些什么呢?

+0

你打电话来得到这个错误的代码是什么?或者当'User :: Groupable'模块被加载时发生? – PinnyM 2013-04-11 16:18:16

+0

加载'User :: Groupable'时发生。 – nullnullnull 2013-04-11 16:20:59

回答

27

看起来这种行为是通过设计的,正如here很好地解释的那样。

你需要在这种情况下,做的是没有Group::ConstantsActiveSupport::Concern延伸,因为这将与其它ActiveSupport::Concern扩展模块共享的(尽管将在包括第二模块类最终被共享阻止其实施):

module A 
    TEST_A = 'foo' 
end 

module B 
    extend ActiveSupport::Concern 
    TEST_B = 'bar' 
end 

module C 
    extend ActiveSupport::Concern 
    include A 
    include B 
end 

C::TEST_A 
=> 'foo' 
C::TEST_B 
=> uninitialized constant C::TEST_B 

class D 
    include C 
end 

D::TEST_A 
=> 'foo' 
D::TEST_B 
=> 'bar' 

总之,你需要做Group::Constants一个标准模块,然后一切都会好起来。

+0

优秀的回应和很好的参考。谢谢! – nullnullnull 2013-04-12 00:35:51

+1

难道你不能把常量包含在一个'included do'块中,并用'self ::'作为前缀吗? – 2016-02-29 22:26:38

+0

@EddiePrislac不,不会这样做。 'included'被ActiveSupport模块劫持,并且在标准(非ActiveSupport)类或模块包含它们之前不会实际触发代码。 – PinnyM 2016-03-01 18:20:22