Класс Rails забывает свои переменные класса - PullRequest
2 голосов
/ 17 марта 2020

У меня есть класс, который живет в lib / my_class.rb:

class MyClass
  @@val = nil
  def self.configure(val)
    @@val = val
  end

  def self.getval
    @@val
  end
end

В config / initializers / my_class.rb:

MyClass.configure(314)
SOME_VAR = 314

Однако, если я открываю рельсы консоль, я вижу следующий результат:

MyClass.getval
> nil
SOME_VAR
> 314
MyClass.configure(123)
MyClass.getval
> 123

Еще более странно то, что, если я переместу MyClass.configure(314) в environment.rb, я могу запустить MyClass.getval в консоли, и он вернет 314, как и ожидалось. Тем не менее, сервер rails случайным образом «забудет» сохраненное значение, из-за чего мне потребуется перезапустить сервер. Я думаю, что он перезагружает файл класса, заставляя его сбросить его состояние.

Я немного осмотрелся и не смог найти других примеров этой проблемы. Я на Rails 6.

1 Ответ

1 голос
/ 17 марта 2020

Классы в рельсах эфемерны, им не нужно сохранять состояние после использования. Это плохая парадигма, вы должны инициализировать свои предложения с помощью метода initialize и только тогда, когда вы собираетесь получить к ним доступ. Также настройка класса должна начинаться с метода инициализации

class MyClass
 attr_reader :some_var
 def initialize(:some_var)
   @some_var = some_var
 end
end

. Это даст вам возможность получить значение, набрав

my_cool_class = MyClass.new(some_var: 'This class is awesome')
# Then you can access the some var with
puts my_cool_class.some_var # Output => 'This class if fucking awesome'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...