Управление локальными переменными Thread
- это действительно плохая идея, и она не приведет ни к чему, кроме грусти, душевной боли и боли.Нет гарантии, что разные части обработки запроса будут обрабатываться одним и тем же потоком, и из-за этого ваши переменные могут в конечном итоге потеряться.
Соглашение Rails заключается в создании переменных экземпляра в контексте ApplicationController,Проще говоря, все, что вы действительно делаете, это:
class ApplicationController < ActionController::Base
before_filter :set_current_subdomain
attr_reader :current_subdomain
helper_method :current_subdomain
protected
def set_current_subdomain
@current_subdomain = request.subdomain
@account = Account.find_by_subdomain(@current_subdomain)
end
end
Любые переменные типа @...
, которые вы создадите, будут присоединены к экземпляру ApplicationController
, связанному с текущим запросом.Важно отметить, что каждый запрос будет выдан совершенно новый экземпляр соответствующего класса контроллера.
Вы можете создавать любые переменные экземпляра, которые вы хотите, при условии, что они не конфликтуют с теми, которые используются RailsСамо по себе, но в общих чертах это случается не очень часто, и вместо этого обычно возникают конфликты имен методов.
Переменные экземпляра уровня класса сохраняются между запросами в средах, где включен флаг "кеширование классов".В среде разработки ваш класс контроллера перезагружается каждый раз, когда делается запрос, чтобы убедиться, что он отражает текущее состояние ваших исходных файлов.