我试图在包含模块时保留类的命名空间。 让我们说我有这些模型:
class Shop < ApplicationRecord
self.abstract_class = true
end
class A::Shop < ::Shop
end
class B::Shop < ::Shop
end
这个控制器:
module A
class ShopController < AuthenticatedController
include Basic::Features
def test
p Shop.new #YES! its a A::Shop
end
end
end
这个模块:
module Basic
module Features
def test
p Shop.new #Shop (abstract)
end
end
end
在上面的示例中,包含模块时会覆盖命名空间。
由于我想在代码库中的多个位置使用Basic::Features
模块,因此我希望在将A::Shop
和B::Shop
包含在控制器中时自动切换。
任何人都知道这是否可能,以及如何。
答案 0 :(得分:0)
这是一个选项:
module Basic
module Features
def test
p Object.const_get('::' + self.class.to_s.split('::').first + '::Shop')
end
end
end
如果你有更深的名称空间,它将不起作用,例如A::B::Shop
,但它可以成功。同样在rails中,您可以使用deconstantize
代替split
。
我认为您编码的原因不起作用是因为它正在查找A::ShopController
命名空间,因为未找到它然后尝试根命名空间::
,并找到Shop
。< / p>