【问题标题】:Getting NameError: uninitialized constant when one class is accessed in another class, both sharing a common module获取NameError:在另一个类中访问一个类时未初始化的常量,两者共享一个公共模块
【发布时间】:2016-07-27 06:27:23
【问题描述】:

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::AbcDecorator#xyz_decorator 方法中被解析为Api::V1::CustomNamespace::XyzDecorator

我尝试通过以下方式修改
/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

【问题讨论】:

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


    【解决方案1】:

    我遇到了类似的问题。您可以尝试按如下方式制作命名空间:

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

    【讨论】:

    • 谢谢。您的建议在我的帖子中已经提到。
    • @JiggneshhGohel 抱歉,没有注意到:/
    猜你喜欢
    • 2016-01-08
    • 2017-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-22
    • 2020-11-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多