了解命名空间

时间:2015-05-25 16:36:45

标签: ruby-on-rails ruby

当我运行我的测试时,我得到一个错误未定义的常量Admin :: Blog :: Category。

模型的定义如下:

module Blog
  class Category < ActiveRecord::Base
    ...
  end
end

当我尝试从我的管理员控制器调用它时,我收到错误。控制器的定义如下:

module Admin
  module Blog
    class CategoriesController < Admin::AdminController
      ...
    end
  end
end

我的问题是这个名称间隔不正确或我如何调用Blog :: Category模型?

1 个答案:

答案 0 :(得分:1)

您需要将其称为::Blog::Category.all,例如获取控制器内的所有类别。了解搜索将如何发生的细节。

module Blog
  class Category
    #...
  end
end

module Admin
  module Blog
    class Categories
      def self.class_name
        Module.nesting
      end
    end
  end
end

Admin::Blog::Categories.class_name
# >> [Admin::Blog::Categories, Admin::Blog, Admin]

在此之后它将搜索顶层。我们来看两个例子:

module Blog
  class Category
    #...
  end
end

Category = 12

module Admin
  module Blog
    class Categories
      def self.const_value
        Category
      end
    end
  end
end

Admin::Blog::Categories.const_value # => 12

,现在......

module Blog
  class Category
    #...
  end
end

Category = 12

module Admin
  Category = 11
  module Blog
    class Categories
      def self.const_value
        Category
      end
    end
  end
end

Admin::Blog::Categories.const_value # => 11

按照上面的两个例子,这个例子,应该抛出错误:

module Blog
  class Category
    #...
  end
end

module Admin
  module Blog
    class Categories
      def self.const_value
        Category
      end
    end
  end
end

Admin::Blog::Categories.const_value
# uninitialized constant Admin::Blog::Categories::Category (NameError)

阅读本指南tutorial以了解此主题。

最后完成:

module Blog
  class Category
  end
end

module Admin
  module Blog
    class Categories
      def self.const_value
        ::Blog::Category
      end
    end
  end
end

Admin::Blog::Categories.const_value # => Blog::Category