Ruby on Rails中的Web请求中存在哪些数据(如果有)?

Dan*_*ley 18 singleton persistence controller ruby-on-rails

我决定在创建视图助手类时使用单例设计模式.这让我思考; 单例实例是否会在请求中存活?这导致了另一个问题,哪些变量(如果有的话)在Web请求中存活,并且这取决于部署?(Fastcgi,Mongrel,Passenger,......)

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

tad*_*man 18

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

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

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

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