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

Я понял когда мы думаем о пользователях, паролях и переменных сайта в ActiveResource::Base, они могут быть изменены при одном запросе и останутся измененными при следующем запросе. Это кажется нежелательным поведением и, возможно, широко распространенной проблемой, поскольку оно применимо ко всем видам использования переменных/атрибутов класса.

Предоставляет ли Rails механизм для очистки изменений состояния на уровне класса (например, сброс до значения по умолчанию), чтобы каждый запрос запускался в первозданном состоянии?

Если нет, можно ли добавить способ инициализации переменных класса, которые будут повторно применяться в начале каждого запроса? Это можно комбинировать с потокобезопасным хранилищем, что делает переменные класса гораздо менее проблематичными. Возможная модификация class_attribute?

Обновление:

Как я описал в связанный вопрос выше, конкретный случай, который привлек мое внимание, заключался в том, что я устанавливал ActiveResource::Base.user и пароль для каждого пользователя. Если мне когда-нибудь не удастся сбросить их, это будет означать, что запросы REST от имени одного пользователя будут выполняться с использованием учетных данных другого при последующих загрузках страницы.


person Nick Urban    schedule 11.11.2011    source источник


Ответы (1)


Просто из любопытства, можете ли вы привести конкретный пример того, почему вы хотите это сделать? На первый взгляд это звучит так, как будто вы запрашиваете изменение переменной, поэтому Rails делает то, о чем вы просите.

Что касается ответа, то несколько вариантов:

  • Для переменных нет автоматического «переключения на значение по умолчанию», нет.
  • Вы можете вручную сбросить значения в конце каждого действия контроллера, где вы хотите, чтобы это произошло.
  • Вы можете написать модуль, который делает это (назовите его «acts_as_resettable»?), а затем включить этот модуль в классы, где вы хотите использовать эту функциональность.
person jefflunt    schedule 11.11.2011
comment
Кажется, что расширение class_attribute было бы хорошим способом сделать это, потому что оно уже обеспечивает поведение, которое я хочу (наследуемые атрибуты уровня класса). Ему можно передать значение по умолчанию, которое будет сохраняться и сбрасываться при каждом запросе, и он может использовать Thread.current, как предложил @KandadaBoggu в другом посте, чтобы гарантировать безопасность потоков, если это проблема. - person Nick Urban; 12.11.2011