我正在查看Rails Engine tutorial,其中一个代码块如下所示:
ex. if(val["id"] > 10){
//Change picture to 1.jpg
} elseif(val["id"] > 20){
//Change picture to 2.jpg
} else {
//Change picture to 3.jpg
};
module Blorgh
class Engine < ::Rails::Engine
isolate_namespace Blorgh
end
end
是什么意思?我知道这可能是一个微不足道的Ruby问题,然而,我似乎无法在任何地方找到任何东西。
感谢。
答案 0 :(得分:5)
所以,Ray确实如此。我想再添一个例子。
假设我们有一个名为Foo的引擎(原创,对吗?),它安装在一个名为Bar的主机应用程序中,类似于:
#bar/config/routes.rb
Rails.application.routes.draw do
...
mount Foo::Engine, at: '/'
...
end
Foo有一个application_controller:
#foo/app/controllers/foo/application_controller.rb
module Foo
class ApplicationController < ActionController::Base
...
def foo_action
...
end
...
end
end
Bar有一个application_controller:
#bar/app/controllers/application_controller.rb
class ApplicationController < ActionController::Base
...
def bar_action
...
end
...
end
现在,假设我们在Foo引擎中有两个控制器,例如:
#foo/app/controllers/foo/baz_controller.rb
module Foo
def BazController < ApplicationController
...
end
end
和
#foo/app/controllers/foo/bif_controller.rb
module Foo
def BifController < ::ApplicationController
...
end
end
BazController
继承自ApplicationController
(前面没有::
)。这意味着它在当前名称空间(ApplicationController
)中查找Foo
。因此,它会在foo_action
中定义Foo::ApplicationController
。
BifController
继承自::ApplicationController
(前面的::
)。这意味着它在全局命名空间中查找ApplicationController
,在本例中,它是主机应用程序Bar
。因此,它会在Bar bar_action
中定义ApplicationController
。
答案 1 :(得分:3)
分层次地考虑所有模块和类:它正在寻找&#34; Rails&#34;在顶层与#34;引擎&#34;在下一个级别。
e.g:
module Rails
class Engine
end
end
module SomethingElse
class Rails
end
end
::Rails
在第一个代码段中选择模块,该代码段位于顶层。
::Rails::Engine
选择位于顶级Engine
模块中的班级Rails
。
答案 2 :(得分:1)
::
前面的::Rails::Engine
表示在全局命名空间的顶部查找Rails::Engine
,而不是在Blorgh
命名空间内。
没有对比,没有此代码中的::
,
module Blorgh
class Engine < Rails::Engine
isolate_namespace Blorgh
end
end
第二行会查找Blorgh::Rails
,您会收到错误NameError: uninitialized constant Blorgh::Rails
。