Rails:关注一个常量的问题

avelit 发布于 2019-03-09 最后更新 2019-03-09 14:31 0 浏览

我担心我存储常量:

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
看起来第一个问题是在第二个问题上没有正确加载。如果是这样的话,我能做些什么呢?
已邀请:

set

赞同来自:

看起来这种行为是设计的,正如在here上所解释的那样。 在这种情况下你需要做的是没有从ActiveSupport::Concern扩展Group::Constants,因为这将阻止其实现与其他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作为标准模块,然后一切都会很好。