Ruby 2.3.0
Rails 4.2.5.1
/app/decorators/api/v1/custom_namespace/xyz_decorator.rb
module Api
module V1
class CustomNamespace::XyzDecorator < CustomDelegator
end
end
end
/app/decorators/api/v1/abc_decorator.rb
module Api
module V1
class AbcDecorator < CustomDelegator
def xyz_decorator
CustomNamespace::XyzDecorator.new
end
end
end
end
当AbcDecorator
实例尝试访问xyz_decorator
时,代码会出现错误
NameError:
uninitialized constant CustomNamespace::XyzDecorator
我希望CustomNamespace::XyzDecorator
在Api::V1::CustomNamespace::XyzDecorator
方法中Api::V1::AbcDecorator#xyz_decorator
得到解决。
我试图修改
/app/decorators/api/v1/custom_namespace/xyz_decorator.rb 以下方式,但仍然出现同样的错误:
module Api
module V1
module CustomNamespace
class XyzDecorator < CustomDelegator
end
end
end
end
当我使用如下代码所示的完全限定名称时,它可以正常工作。
/app/decorators/api/v1/abc_decorator.rb
module Api
module V1
class AbcDecorator < CustomDelegator
def xyz_decorator
Api::V1::CustomNamespace::XyzDecorator.new
end
end
end
end
任何人都可以让我了解发生了什么以及为什么我的第一个版本的代码不起作用?
P.S:没有定义明确定义模块的文件:
/app/decorators/api.rb
module Api
end
/app/decorators/api/v1.rb
module Api
module V1
end
end
/app/decorators/api/v1/custom_namespace.rb
module Api
module V1
module CustomNamespace
end
end
end
答案 0 :(得分:0)
我遇到了类似的问题。您可以尝试按如下方式创建名称空间:
module Api
module V1
class AbcDecorator < CustomDelegator
def xyz_decorator
CustomNamespace::XyzDecorator.new
end
end
end
end
和
module Api
module V1
class CustomNamespace::XyzDecorator < CustomDelegator
end
end
end
我不是100%肯定,但我认为它只会自动添加命名空间,如果您尝试调用的模型名称被完全定义为调用它 - 即如果您在更多名称空间下调用A::B.new
然后你必须定义它class A::B
。此外,通过使用短(A::B
)版本声明类,它不会自动命名在类中调用的其他模型。