[英]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 Some
与Some::
具有相同的效果,那意味着模块在这里/正在做什么? 它真的是一个模块......还是一个命名空间?!
谢谢!
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.