El *_*apo 4 ruby ruby-on-rails
我正在查看Rails引擎教程,其中一个代码块如下所示:
module Blorgh
class Engine < ::Rails::Engine
isolate_namespace Blorgh
end
end
Run Code Online (Sandbox Code Playgroud)
什么::Rails::Engine
意思?我知道这可能是一个微不足道的Ruby问题,但是,我似乎无法在任何地方找到任何东西.
谢谢.
所以,Ray完全正确.我想补充一个例子.
假设我们有一个名为Foo的引擎(原创,对吗?),它安装在名为Bar的主机应用程序中,类似于:
#bar/config/routes.rb
Rails.application.routes.draw do
...
mount Foo::Engine, at: '/'
...
end
Run Code Online (Sandbox Code Playgroud)
Foo有一个application_controller:
#foo/app/controllers/foo/application_controller.rb
module Foo
class ApplicationController < ActionController::Base
...
def foo_action
...
end
...
end
end
Run Code Online (Sandbox Code Playgroud)
并且Bar有一个application_controller:
#bar/app/controllers/application_controller.rb
class ApplicationController < ActionController::Base
...
def bar_action
...
end
...
end
Run Code Online (Sandbox Code Playgroud)
现在,假设我们在Foo引擎中有两个控制器,如:
#foo/app/controllers/foo/baz_controller.rb
module Foo
def BazController < ApplicationController
...
end
end
Run Code Online (Sandbox Code Playgroud)
和
#foo/app/controllers/foo/bif_controller.rb
module Foo
def BifController < ::ApplicationController
...
end
end
Run Code Online (Sandbox Code Playgroud)
在BazController
从继承ApplicationController
(没有::
在前面).这意味着它ApplicationController
在当前名称空间(Foo
)中查找.所以它将具有foo_action
定义的Foo::ApplicationController
.
在BifController
从继承::ApplicationController
(::
在前面).这意味着它ApplicationController
在全局命名空间中查找,在本例中,它是主机应用程序Bar
.所以它将bar_action
在Bar中定义ApplicationController
.
按层次结构思考所有模块和类:它在顶层寻找“Rails”,在下一层寻找“Engine”。
例如:
module Rails
class Engine
end
end
module SomethingElse
class Rails
end
end
Run Code Online (Sandbox Code Playgroud)
::Rails
选择第一个代码片段中的模块,该代码片段位于顶层。
::Rails::Engine
Engine
选择顶级模块中的类Rails
。
::
前面的 表示在全局命名空间的顶部::Rails::Engine
查找,而不是在命名空间内部查找。Rails::Engine
Blorgh
没有对比,没有::
这段代码中的 as,
module Blorgh
class Engine < Rails::Engine
isolate_namespace Blorgh
end
end
Run Code Online (Sandbox Code Playgroud)
第二行将寻找Blorgh::Rails
,你会得到一个错误,NameError: uninitialized constant Blorgh::Rails
。
归档时间: |
|
查看次数: |
3346 次 |
最近记录: |