控制器 class 在什么时候实例化 Rails 网络应用程序中的控制器对象?

At what point does a controller class instantiate a controller object in a Rails web app?

学习 Rails,我不清楚控制器实例化的时间点,而模型实例化的时间点在某种程度上是可以识别的,例如,当用户在 from 和单击提交按钮是一种导致创建对象模型的触发器。

做了一些研究,我在脑海中想象,当通过浏览器发送 HTTP 请求时,到控制器的路由成为从控制器 class 实例化某个控制器对象的触发器。

这样说对吗?

当我们在 routes.rb 中定义路由时,控制器会在控制器开始工作时转到控制器操作

它与面向对象编程更相关,当您在 class

上调用 new 时,对象总是被实例化
2.0.0-p648 :001 > Class.new
 => #<Class:0x007fee8e99d9a8> 
2.0.0-p648 :002 > 

这里对象被实例化,并且在 rails 中类似地当你调用任何动作时让我们说

def new
  @article = Article.new
end

新对象启动,当你点击save时,你实际上是在调用create动作,并传递当前对象。

def create
  @article = Article.create(article_params)
  @article.save
end

此处 .create 方法填充对象 article_params.save 方法将对象保存在数据库中。

当 HTTP 请求进入您的应用服务器(puma、webrick 等)时,请求通过一堆中间件(在 rails gem 中定义),它将 HTTP 请求转换为ActionDispatch::Request class 的一个实例,用于根据 config/routes.rb 中定义的路由定义确定正确的路由以分派到 rails 应用中的适当控制器 class ].

然后将生成的 request 对象分派到相应的控制器和操作方法,该方法实例化控制器 class 并在其实例上使用 params 对象的参数调用操作方法(ActionController::Parameters 的实例)。

这只是控制器如何实例化的一般概述。请求对象在生成 request 对象之前经过一系列中间件 classes 和模块。

如果你想read it in detail,这里有一篇好文章。