繁体   English   中英

了解 Rails 6 上 Ruby 中的路由 + 模块/类名称 [以及在此上下文中模块是什么]

[英]Understanding routes + module/class names in Ruby on Rails 6 [and what a module is in this context]

如果我有一条路线在特定位置查找 controller 操作,例如:

things_path     GET /things     some/things#index

我可以通过以下任一方式满足这条路径:

# app/controllers/some/things_controller.rb
class Some::ThingsController
  def index
    # do stuff
  end
end
# app/controllers/some/things_controller.rb
module Some
  class ThingsController
    def index
      # do stuff
    end
  end
end

不是

# app/controllers/some/things_controller.rb
class ThingsController
  def index
    # do stuff
  end
end

而且我不明白为什么,或者module一词的含义...

在我的脑海中,路线想要在some目录中找到things_controller.rb (在自动加载的路径上,[我已指定app/controllers ])。

为什么 rails 需要我的文件内容来指定/匹配位置?

如果module SomeSome::具有相同的效果,那意味着模块在这里/正在做什么? 真的是一个模块......还是一个命名空间?!

谢谢!

Rails 上的 Ruby 使用名为Zeitwerk的常量自动加载器。 这个自动加载器加载常量,这就是你永远require自己的项目文件(在app/中)的原因。

这个自动加载系统带有一些文件结构约束/先决条件。 例如,必须在任何app/*目录的admin/users_controller.rb文件中定义常量Admin::UsersController

Admin::UsersController查找时,自动加载器将首先搜索admin.rb 如果没有找到该文件,则假定Admin是一个命名空间,并且自动加载器将动态创建Admin模块 加载Admin后,自动加载器会查找admin/users_controller.rb

您可以在app/controllers/some/things_controller.rb文件中定义ThingsController ,但您必须将app/controllers/some/标记为自动加载路径,这可能不是您想要的。 可以说更好的选择是将文件移动到app/controllers/things_controller.rb

有关自动加载器的完整说明,我建议阅读Ruby on Rails - 自动加载和重新加载常量(Zeitwerk 模式)指南。


和...之间的不同:

module Admin
  class UsersController < ApplicationController
  end
end

和:

class Admin::UsersController < ApplicationController
end

是常量查找上下文。

在第一种情况下,如果您在UsersController中使用常量。 Ruby 以下列方式查找常数:

  • Admin::UsersController::MY_CONSTANT
  • 如果上面没有找到: Admin::MY_CONSTANT
  • 如果上面没有找到::MY_CONSTANT (根常量)
  • 如果上面没有找到: NameError (uninitialized constant...)

第二种情况类似,但跳过了Admin::MY_CONSTANT步骤,因为您没有打开Admin模块。

请注意,以大写字母开头的任何内容都被视为常量,这可以是像上面一样的常量值(通常是全大写,但不是必需的),但类和模块也是常量(通常是驼峰式)。

有关常量查找结帐的更多信息您想知道的关于 Ruby 中的常量查找的所有信息

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM