在Rails

时间:2017-07-20 14:07:12

标签: ruby-on-rails ruby ruby-on-rails-3

我试图在包含模块时保留类的命名空间。 让我们说我有这些模型:

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::ShopB::Shop包含在控制器中时自动切换。

任何人都知道这是否可能,以及如何。

1 个答案:

答案 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>