获取NameError:在另一个类中访问一个类时,uninitialized常量,两者共享一个公共模块

时间:2016-07-27 06:27:23

标签: ruby ruby-on-rails-4 model-view-controller nameerror

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::XyzDecoratorApi::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

1 个答案:

答案 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)版本声明类,它不会自动命名在类中调用的其他模型。