【发布时间】:2018-01-20 16:49:34
【问题描述】:
学习 Rails,我不清楚控制器实例化的点,而模型实例化的点在某种程度上是可识别的,例如,当用户在 from 中输入数据并单击提交按钮时排序导致创建对象模型的触发器。
做了一些研究,我在脑海中想象,当通过浏览器发送 HTTP 请求时,到控制器的路由成为从控制器类实例化某个控制器对象的触发器。
这有点正确吗?
【问题讨论】:
标签: ruby-on-rails ruby oop object object-lifetime
学习 Rails,我不清楚控制器实例化的点,而模型实例化的点在某种程度上是可识别的,例如,当用户在 from 中输入数据并单击提交按钮时排序导致创建对象模型的触发器。
做了一些研究,我在脑海中想象,当通过浏览器发送 HTTP 请求时,到控制器的路由成为从控制器类实例化某个控制器对象的触发器。
这有点正确吗?
【问题讨论】:
标签: ruby-on-rails ruby oop object object-lifetime
当 HTTP 请求进入你的应用服务器(puma、webrick 等)时,请求会经过一个中间件堆栈(定义在 rails gem 中),它将 HTTP 请求转换为 ActionDispatch::Request 类的实例用于根据config/routes.rb 中定义的路由定义来确定正确的路由以分派到您的rails 应用程序中的适当控制器类。
然后将生成的request 对象分派到相应的控制器和操作方法,该方法实例化控制器类并在其实例上调用params 对象(ActionController::Parameters 的实例)的参数的操作方法。
这只是对如何实例化控制器的一般概述。在生成request 对象之前,请求对象会经过一系列中间件类和模块。
如果你想read it in detail,这里有一篇好文章。
【讨论】:
当我们在 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
这里用article_params 和.save 方法填充对象的.create 方法将对象保存在数据库中。
【讨论】: