Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 为什么Rails为每个请求创建一个控制器?_Ruby On Rails_Controller - Fatal编程技术网

Ruby on rails 为什么Rails为每个请求创建一个控制器?

Ruby on rails 为什么Rails为每个请求创建一个控制器?,ruby-on-rails,controller,Ruby On Rails,Controller,从上一篇文章中,我了解到Rails为每个请求创建一个控制器实例 我的问题是,因为这个主题与我正在从事的项目的设计有关: 为什么Rails会创建一个新的 class SomeController < ApplicationController; end class-SomeController

从上一篇文章中,我了解到Rails为每个请求创建一个控制器实例

我的问题是,因为这个主题与我正在从事的项目的设计有关:

为什么Rails会创建一个新的

class SomeController < ApplicationController; end
class-SomeController

处理每个传入的请求?为什么不创建singleton对象并将请求转发到此对象?这似乎更有效,因为我们不会浪费资源来分配和清理请求对象

实例化一个新控制器实例的开销很小,这意味着两个完全不相关的请求之间没有意外共享状态。处理器时间上的任何“节省”都会被产生毁灭性错误的可能性所抵消

请记住,控制器用于存储特定于请求的状态。重复使用控制器需要您在每次操作开始时重置所有设置的
@变量。否则,像
@is_admin=true
这样的内容可能会被设置,并且永远不会被清除。您实际引入的不太人为的bug将更加微妙,并且会消耗开发人员的时间

你看到的是没有优化的地方。某些东西必须维护状态并在请求之间重置,否则您会遇到意外共享状态的噩梦。如果在请求之间持久化控制器实例,那么只需将维护/重置状态的工作推到较低的级别,其中的答案可能仍然是为每个请求实例化某个状态管理类的新实例。计算机非常擅长分配和释放资源,所以在你真正知道这是一个瓶颈之前,不要担心这一点。在这种情况下,为每个请求实例化一个新的控制器很容易就是正确的选择


就Rails而言,从代码清晰性和可用性的角度来看,能够使用
@variable=value
是一个重大的胜利,这或多或少需要在请求完成时丢弃控制器的每个实例。

问得好,你应该问DHH:)但我认为主要的一点是将一个环境与另一个环境完全隔离。因为否则,系统必须为分配逻辑花费更多的处理能力。这是因为在不存在践踏另一个请求数据的风险的情况下,更容易对代码进行推理。这并不奇怪,但Grails似乎也做了同样的事情。嗯。。。与其说
@foo
总是需要被清除,不如说控制器需要被写入没有共享状态,比如Java servlet。您可以使用与Java中不同的机制(局部变量、请求等)将值传递给视图层。控制器仅用于存储特定于请求的状态,因为它们是按请求实例化的——但这不是控制器概念的固有特性;其他框架的做法有所不同。我知道你知道,只是澄清一下。@DaveNewton是的,我考虑过进入这个领域,但问题是关于性能的,所以我认为“某些东西必须在请求之间重置状态”中涵盖了这一点。jist的关键在于,保持控制器实例不变不会提高性能。您只是在移动分配/解除分配。同意,我更喜欢每个请求的实例:少思考。