在Rails中,每个新请求都会重置任意类的类属性吗?

时间:2018-04-07 18:56:00

标签: ruby-on-rails ruby-on-rails-5

假设我的Rails应用程序中有一个Foo类。

class Foo   
  @@bar = "hello"
  def self.change
    @@bar = "goodbye" 
  end

  def self.get_bar
    @@bar
  end 
end

如果在某些时候,某些用户执行包含

的控制器操作
Foo.change

Foo.get_bar会在每个用户会话中返回“goodbye”,直到服务器重新启动?

2 个答案:

答案 0 :(得分:1)

开发环境中,每个请求都会重新加载类,因此您会在每个请求中看到类变量重置。

生产环境中,每个请求都没有 重新加载类,因此通常应该在给定Ruby进程中的请求之间保留类变量。

请记住,某些Rails服务器可能实际上有多个进程,因此无法保证所有用户和所有请求都将共享类变量。

其他Rails服务器可能是多线程的,因此您必须特别注意如何改变共享状态(例如类变量)。

由于这些原因,避免像@ andrew21所提到的那样使用类变量可能是个好主意。

答案 1 :(得分:0)

是的,@@是类变量,除了类变量不是线程安全的,因此多线程系统将对此做出不一致的响应。一般经验法则:不要使用类变量。

Why should we avoid using class variables @@ in rails?