【问题标题】:At what point does a controller class instantiate a controller object in a Rails web app?控制器类在什么时候实例化 Rails Web 应用程序中的控制器对象?
【发布时间】:2018-01-20 16:49:34
【问题描述】:

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

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

这有点正确吗?

【问题讨论】:

    标签: ruby-on-rails ruby oop object object-lifetime


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 非常感谢!我一直在寻找的层的解释!
    【解决方案2】:

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

    【讨论】:

    • 我希望看到关于控制器在何处、什么点以及如何实例化的低层解释。
    【解决方案3】:

    它与面向对象编程更相关,当你在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 方法将对象保存在数据库中。

    【讨论】:

    • 我了解模型是如何被实例化的,但我想知道控制器是如何被实例化的。
    • 当你的应用程序收到一个请求时,路由会决定运行哪个控制器和动作,然后 Rails 会创建该控制器的一个实例并运行与动作同名的方法。
    猜你喜欢
    • 2013-01-16
    • 2023-03-08
    • 1970-01-01
    • 2017-11-22
    • 2023-03-20
    • 1970-01-01
    • 2011-03-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多