Rails引擎和命名空间。需要命名空间的情况?

时间:2012-08-30 10:58:47

标签: ruby-on-rails ruby-on-rails-3 rails-engines

我对引擎中的命名空间有点困惑。在使用isolate_namespace的Rails引擎中,

module Blog
  class Engine < Rails::Engine
    isolate_namespace Blorgh
  end
end

何时需要您引用 >对象<{1}}(例如Blog与仅Blog::Post)?

例如,在引擎Post资源的控制器内,是否可以Post?如果您绝对需要使用Post.find

同样在模型关联中,假设发布Blog::Post。不知何故,我希望将其定义如下:

has_many :comments

因为所有内容都是命名空间(模型,表名,......),但它看起来像class Post < ActiveRecord::Base :has_many "blog/comments" end 才有效。为什么命名空间不用于关联键,并且在主机应用程序中存在has_many :comments资源的情况下,rails如何知道我指的是哪个Comment

1 个答案:

答案 0 :(得分:2)

当你进入某个模块时,你可以在不给出模块名称的情况下引用模块的其他成员,例如:

module Foo

  class Bar
    def initialize
      @baz = Baz.new # same as Foo::Baz.new
    end
  end
  class Baz

  end
end

如果当前模块中不存在Baz,它将向下级联以查找定义,最终调用const_missing(在Rails上构建自动加载的类),然后抛出一个如果找不到任何错误。

其余的问题已经回答here