В Rails атрибуты классов произвольных классов сбрасываются при каждом новом запросе?


Скажем, у меня есть класс Foo в моем приложении Rails.

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

  def self.get_bar
    @@bar
  end 
end

Если в какой-то момент какой-то пользователь выполняет действие контроллера, которое включает

Foo.change

Уилл Фу.get_bar возвращает "goodbye" в каждом сеансе пользователя, пока сервер не будет перезапущен?

2 3

2 ответа:

В средеdevelopment классы перезагружаются при каждом запросе, поэтому вы увидите, что переменные класса сбрасываются при каждом запросе.

В среде production классы не перегружаются по каждому запросу, поэтому обычно переменные класса должны сохраняться в запросах в рамках данного процесса Ruby.

Имейте в виду, что некоторые Rails-серверы могут на самом деле иметь несколько процессов, поэтому вы не гарантируете, что все пользователи и все запросы будут совместное использование переменных класса.

Другие Rails-серверы могут быть многопоточными, поэтому вы должны быть особенно осторожны при изменении общего состояния (например, переменных класса).

По этим причинам было бы неплохо избегать использования переменных класса таким образом, как упоминалось в @andrew21.

Да, @ @ являются переменными класса, за исключением того, что переменные класса не являются потокобезопасными, поэтому многопоточная система будет реагировать на это непоследовательно. общее эмпирическое правило: не используйте переменные класса.

Почему мы должны избегать использования переменных класса @@ в rails?