为什么我们要避免在rails中使用类变量@@?

Man*_*ava 23 ruby ruby-on-rails ruby-on-rails-3

为什么我们要避免在rails中使用类变量@@?这有什么安全漏洞吗?请回答,因为我是新的rails.而我正在使用实例变量@variable_name.我试过一次@@variable_name.

我只知道类变量是,类变量在对象之间是可共享的

但我真的想知道 为什么我们要避免在rails中使用类变量@@?

edg*_*ner 47

仅仅因为它们不是线程安全的.许多rails =有能力的服务器是多线程的.这意味着在任何给定时间可能有多个运行的应用程序实例,并且您的一个用户的任何请求将被任意分配给其中一个.类变量不在进程之间共享,因此在后续请求中您的类变量可能会有所不同.

即使您故意设法在单线程服务器中运行您的应用程序,也无法保证您的应用程序不会在请求之间重新启动,从而丢失您的类变量.

如果您想要类似于类变量提供的功能,我强烈建议您查看键值存储,例如Memcached或Redis.

  • @Victor好吧,`@ variables`是实例变量,它们在**请求中是一致的**因为请求产生了一个新的控制器实例.只是不要指望在下一个请求中找到它们. (9认同)
  • @edgerunner我没有意识到有人会使用`@@ vars`来保存状态(OP没有表明这一点).除了Memcached或Redis之外,我们通常会在Rails中使用session来实现此目的.同时,正确初始化`@@ vars`(以及类级别`@vars`)在生产和开发模式下都非常安全,例如用于存储在此特定rails过程中持久存在的值. (6认同)
  • @MichaeldeSilva这里的简单示例:您可以使用类变量来存储在启动期间从外部服务请求的API令牌的值.然后,该API令牌在整个运行时都可用于该类,并且可以在超时时更新.它独立于任何用户的会话或任何单个请求. (3认同)