Ruby on rails Rails:在关注点中包含一个常数的关注点

Ruby on rails Rails:在关注点中包含一个常数的关注点,ruby-on-rails,separation-of-concerns,Ruby On Rails,Separation Of Concerns,我有一个问题,我在其中存储常量: 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::Constan

我有一个问题,我在其中存储常量:

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
我希望使用这些常量的另一个问题是:

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

看起来第一个问题没有在第二个问题中正确加载。如果是这样的话,我能做些什么呢?

正如上面很好地解释的,这种行为似乎是出于设计

在这种情况下,您需要做的不是让
Group::Constants
extend from
ActiveSupport::Concern
,因为这将阻止它的实现与其他
ActiveSupport::Concern
扩展模块共享(尽管它最终将在包含第二个模块的类中共享):


简而言之,您需要将
Group::Constants
作为一个标准模块,然后一切都会好起来。

如果您想将所有内容都保存在一个文件中,并且如果您能消化一些样板文件,您可以将模块分为“关注”位和“非关注”位:

模块A
FOO=[22]
def自含式底座
包括关注
结束
模块关注点
扩展ActiveSupport::关注点
类方法做什么
def foo_从_a_类_方法_中的_透视图_
{词法:FOO,实例:self::FOO}
结束
结束
结束
结束
模块B
扩展ActiveSupport::关注点
包括
FOO+=[33]
def foo_从_的角度_实例_方法_中_
福
结束
结束
C类
包括B
结束
C.foo_从_的角度_类_方法_中_
=>{:lexical=>[22],:instance=>[22,33]}
C.new.foo\u从\u的角度\u实例\u方法\u在\u B中
=> [22, 33]
C::富
=> [22, 33]

您调用什么代码来获取此错误?还是在加载
User::Groupable
模块时发生?在加载
User::Groupable
时发生。响应良好,参考价值高。谢谢你能不能把常数包装在一个
包含的do
块中,并在它们前面加上
self::
?@EddiePrislac不,那也不行
included
被ActiveSupport模块劫持,在标准(非ActiveSupport)类或模块包含它们之前不会实际触发代码。实际上,我正在执行
included do
并在此块中定义常量(无
self::
),它的工作方式就像是在模型本身中定义的一样。@DannyB,我也尝试过这个方法-在
包含的
块中包装
TEST_B='bar'
,在调用C::TEST_B时遇到了相同的错误。如果您有一些代码来证明这是有效的,我很高兴看到它-欢迎与我一起讨论。