簡體   English   中英

在Rails中包含模型時,請保持控制器的命名空間

[英]Keep namespacing of a controller when including a model in Rails

我試圖在包含模塊時保留類的名稱空間。 可以說我有這些模型:

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包含在控制器中時自動在A::ShopB::Shop之間切換。

任何人都知道這是否可行以及如何實現。

這是一個選擇:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM