2015-06-18 97 views
1

我正在使用不處理名稱空間模型的庫。我有一個Rails引擎,它具有我需要使用的所有ActiveRecord模型,因此我使用引擎的名稱空間引用它們,例如:TableEngine :: Posts。如何取消命名空間的紅寶石常量?

有沒有辦法在Ruby中取消命名空間Posts類?

TableEngine::Posts.demodulize # => Posts 
+0

你能創建擴展模塊化的類的類,或創建被設置爲模塊化的類的恆定?我想,這看起來有點won and,可能會以其他壯觀的方式突破。 –

回答

2

起初,你可以添加你需要的常量和類圖/模塊分配給它(記得兩者都只是對象)。你應該重複它重置名稱:

Posts = TableEngine::Posts.dup 

然後刪除源恆名稱:

Object.send :remove_const, :TableEngine 

然後:

Posts 
# => Posts 
TableEngine 
# => NameError: uninitialized constant TableEngine 
TableEngine::Posts 
# => NameError: uninitialized constant TableEngine 

UPDATE。爲什麼dup需要:

通知,class SomeClass是創建Class類型的對象並將其分配給一些固定的快捷方式:

SomeClass = Class.new 

當你創建一個類,它的名字未設置值:

klass = Class.new 
# => #<Class:0x00000001545a28> 
klass.name 
# => nil 

當你把它分配給常數首次名稱分配和memoized:

Klass = klass 
# => Klass 
klass.name 
# => "Klass" 

當你以後Class類型的對象分配給另一個常量,它仍然只是相同的對象,雙方常數簡稱:

NewKlass = Klass 
# => Klass 
Klass.name 
# => "Klass" 
NewKlass.name 
# => "Klass" 

這就是爲什麼即使初始常數將被刪除,對象將繼續帶着舊名字。

Object.send :remove_const, :Klass 
# => Klass 
NewKlass 
# => Klass 
NewKlass.name 
# => "Klass" 

Klass 
# => NameError: uninitialized constant Klass 

該對象本身並沒有改變。被改變的是由Object對象攜帶的常量列表。

當你複製它是在沒有任何名稱(它是新的對象)創建Class類型的對象:

new_klass = NewKlass.dup 
# => #<Class:0x000000016ced90> 
new_klass.name 
# => nil 

而當你把它assing新恆,名稱設置。那就是如何在它上面接收新名稱的第一個例子:

Posts = TableEngine::Posts.dup 
# => Post 
+2

爲什麼當你刪除引用原始文件並且因此有資格進行垃圾回收時會「重複」呢?事實上,即使你沒有刪除參考文獻,我也不明白爲什麼要「複製」課程。 –

0

我結束了使用@Andrew一個輕微的修改建議的解決方案:

::Posts = TableEngine::Posts.dup 

添加「::」防止了帖子類從由內創建它的上下文,離被命名空間:

class PostsController < ApplicationController 
    Posts = TableEngine::Posts.dup # => PostsController::Posts 
    ::Posts = TableEngine::Posts.dup # => Posts 
end