Ruby on rails 了解路线+;RubyonRails6中的模块/类名[以及在此上下文中的模块是什么]

Ruby on rails 了解路线+;RubyonRails6中的模块/类名[以及在此上下文中的模块是什么],ruby-on-rails,ruby,class,module,routes,Ruby On Rails,Ruby,Class,Module,Routes,如果我有一条路由正在特定位置查找控制器操作,例如: 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_controll

如果我有一条路由正在特定位置查找控制器操作,例如:

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
class ThingsController
  def index
    # do stuff
  end
end
我不明白为什么,或者它对术语
模块的含义是什么

在我的头脑中,路线想要在
some
目录中找到
things\u controller.rb
(在自动加载的路径上,[我指定了
app/controllers
])

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

如果
模块Some
模块Some::
具有相同的效果,这意味着模块正在/正在做什么?它真的是一个模块吗。。。或者它是一个名称空间


谢谢大家!

RubyonRails使用一个名为。此自动加载程序加载常量,这就是您永远不必加载自己的项目文件(在
app/
中)的原因

例如,常量
Admin::UsersController
必须在任何
app/*
目录的
Admin/users\u controller.rb
文件中定义

Admin::UsersController
查找中,自动加载程序将首先搜索
Admin.rb
。如果找不到此文件,则假定
Admin
是一个名称空间和。加载
Admin
后,自动加载程序会查找
Admin/users\u controller.rb

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

关于自动加载器的完整解释,我建议阅读指南


两者之间的区别:

module Admin
  class UsersController < ApplicationController
  end
end
模块管理
类UsersController
以及:

class Admin::userscocontroller
是常量查找上下文

在第一个场景中,如果您希望在
userscoontroller
中使用常量,请单击此处。Ruby按以下方式查找常量:

  • Admin::userscocontroller::MY_常量
  • 如果未找到上述内容:
    Admin::MY_常量
  • 如果找不到上面的:
    ::MY_常量
    (根常量)
  • 如果未找到上述内容:
    namererror(未初始化常量…)
第二种情况类似,但跳过了
管理::MY_常量
步骤
,因为您没有打开
管理
模块

请注意,任何以大写字母开头的内容都被视为常量,这可以是如上所述的常量值(通常为大写,但不是必需的),但类和模块也是常量(通常为驼峰大小写)


有关常量查找签出的更多信息,请参见RubyonRails使用名为的常量自动加载程序。此自动加载程序加载常量,这就是您永远不必加载自己的项目文件(在
app/
中)的原因

例如,常量
Admin::UsersController
必须在任何
app/*
目录的
Admin/users\u controller.rb
文件中定义

Admin::UsersController
查找中,自动加载程序将首先搜索
Admin.rb
。如果找不到此文件,则假定
Admin
是一个名称空间和。加载
Admin
后,自动加载程序会查找
Admin/users\u controller.rb

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

关于自动加载器的完整解释,我建议阅读指南


两者之间的区别:

module Admin
  class UsersController < ApplicationController
  end
end
模块管理
类UsersController
以及:

class Admin::userscocontroller
是常量查找上下文

在第一个场景中,如果您希望在
userscoontroller
中使用常量,请单击此处。Ruby按以下方式查找常量:

  • Admin::userscocontroller::MY_常量
  • 如果未找到上述内容:
    Admin::MY_常量
  • 如果找不到上面的:
    ::MY_常量
    (根常量)
  • 如果未找到上述内容:
    namererror(未初始化常量…)
第二种情况类似,但跳过了
管理::MY_常量
步骤
,因为您没有打开
管理
模块

请注意,任何以大写字母开头的内容都被视为常量,这可以是如上所述的常量值(通常为大写,但不是必需的),但类和模块也是常量(通常为驼峰大小写)


有关常量查找签出的更多信息

非常感谢您提供的详细答案,它确实很有帮助:)当您说“
关于Admin::userscocontroller
查找时,自动加载程序将首先搜索
Admin.rb
”,您的意思是它正在
Admin.rb
中查找常量
userscocontroller
?所以如果它在那里找到一个,它会停止寻找其他东西吗?(例如,从未找到
用户\u controller.rb
)。如果您有
admin.rb
,但没有定义
userscoontroller
,它将继续查找/仍然会自动创建
admin
命名空间?@JoshuaESummers no。如果您访问
admin::userscoontroller
,则基本上需要两个常量。首先您请求
管理
,然后您请求<
class Admin::UsersController < ApplicationController
end