什么" ::"在" :: Rails :: Engine"之前意思

时间:2016-02-25 03:13:10

标签: ruby-on-rails ruby

我正在查看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问题,然而,我似乎无法在任何地方找到任何东西。

感谢。

3 个答案:

答案 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