我使用的是不处理命名空间模型的库。我有一个rails引擎,它包含我需要使用的所有ActiveRecord模型,因此我使用引擎的命名空间引用它们,例如:TableEngine :: Posts。
Ruby中有没有办法取消对Posts类的命名空间?
类似
<a href="#section1">Go to section 1</a>
答案 0 :(得分:2)
首先,您可以添加所需的常量并将类/模块分配给它(记住两者都只是对象)。您应该复制它以重置名称:
Posts
# => Posts
TableEngine
# => NameError: uninitialized constant TableEngine
TableEngine::Posts
# => NameError: uninitialized constant TableEngine
然后删除源常量名称:
dup
然后:
class SomeClass
<强>更新即可。为什么需要Class
:
请注意,SomeClass = Class.new
是创建klass = Class.new
# => #<Class:0x00000001545a28>
klass.name
# => nil
类型对象并将其分配给某个常量的快捷方式:
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
对象携带的常量列表。
复制Posts = TableEngine::Posts.dup
# => Post
类型的对象时,它创建时没有任何名称(它是新对象):
{{1}}
当你将它添加到新常量时,名称就会被设置。这就是上面第一个例子中它接收新名称的方式:
{{1}}
答案 1 :(得分:0)
我最终使用@Andrew建议的解决方案稍作改动:
::Posts = TableEngine::Posts.dup
添加&#39; ::&#39;防止Posts类被创建它的上下文命名,例如:
class PostsController < ApplicationController
Posts = TableEngine::Posts.dup # => PostsController::Posts
::Posts = TableEngine::Posts.dup # => Posts
end