ruby-on-rails - Ruby on Rails 中的 Web 请求中保留哪些数据(如果有)?

标签 ruby-on-rails singleton persistence controller

我决定使用 单例 创建 View 助手类时的设计模式。这让我思考;单例实例会在请求中存活吗?这导致了另一个问题,哪些变量(如果有)在 Web 请求中存活 这会根据部署而改变吗? (Fastcgi、Mongrel、Passenger、...)

我知道 Controller 实例变量没有持久化。我知道常量是持久的(或重新加载?)。但是我不知道类变量,类上的实例变量,Eigenclasses,......

最佳答案

简单的答案是没有。每个请求都被视为一个独立的事件,除了存储在用户 session 和任何外部数据库、缓存或文件存储中的内容之外,不会传递任何状态信息。最好在设计应用程序时考虑到这一点,而不是仅仅因为设置了它们就期望它们会持续存在。

更复杂的故事是有些事情确实持续存在。例如,您可以在 Controller 上创建一个类变量,这将按照您的预期从一个请求传递到下一个请求。问题是这仅适用于该 Controller 的单个实例,包含在该进程中,不适用于其他进程提供的请求。如果您需要缓存,请使用 Rails.cache 基础架构并避免自己进行黑客攻击。

典型的生产环境是一个复杂且不断变化的事物,其中不断创建和销毁流程,并且无法提前确定哪个流程最终将最终服务于特定请求。由于许多部署不仅涉及单台机器上的多个进程,还涉及多台机器,因此实际上没有实用的方法来创建应用程序范围的单例对象。

您可以做的最好的事情是在缓存引擎之上构建一个层,其中您的单例对象只是从缓存中获取和写入的函数的包装器。这为您提供了单例对象的外观,同时保持了进程间的一致性。

关于ruby-on-rails - Ruby on Rails 中的 Web 请求中保留哪些数据(如果有)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2791093/

相关文章:

ruby-on-rails - 在 Heroku 上的 Rails 应用程序之间共享用户数据和登录信息

ruby-on-rails - 如何对一个值的重复求和并将其添加到 Ruby 中一个键的两个值中?

c# - 我应该使用单例吗?

c# - 静态构造函数和单例

来自两个 Main 类的 Java Access 单例类实例

java - JDOQL 在搜索成员列表变量中是否存在一个或多个元素时,有什么方法可以避免查询中的多个 .contains() 调用吗?

iphone - Objective-C - 如何保存和加载包含图像的数组

ruby-on-rails - AbstractController::DoubleRenderError 不应该的

ruby-on-rails - App Engine Cron 作业始终返回 HTTP 状态代码 301

java - 无法保存 OneToOne 关系