我决定使用 单例 创建 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/