Подтвердить что ты не робот

Где хранятся переменные экземпляра в вспомогательном модуле Rails?

Учебник, который я следую, имеет в подкаталоге app/helpers ниже модуль SessionHelper, который используется многими контроллерами и представлениями. Но где хранится переменная экземпляра current_user при ее создании? Каков класс объекта, в котором он хранится?

Когда контроллер сначала вызывает метод current_user, создается переменная экземпляра current_user. Когда представление затем вызывает метод current_user, каким образом уже существует переменная экземпляра current_user? Является ли self объектом контроллера во время рендеринга представления?

module SessionsHelper
  ...
  def current_user
    @current_user ||= User.find_by_remember_token(cookies[:remember_token])
  end
  ...
end
4b9b3361

Ответ 1

Этот ответ рассказывает о том, как передаются переменные экземпляра между контроллером и представлением: Как переменные экземпляра Rails передаются в представления?

В принципе, если @current_user задается контроллером, эта переменная экземпляра (вместе со всеми остальными) будет передана из контекста вашего контроллера в контекст представления. Если он не был установлен контроллером, он будет установлен при первом использовании вида.

Для получения дополнительной информации см. другой ответ. Это хорошо прочитано.

Вставить из @mechanicalfish ответ:

def view_assigns
  hash = {}
  variables  = instance_variables
  variables -= protected_instance_variables
  variables -= DEFAULT_PROTECTED_INSTANCE_VARIABLES
  variables.each { |name| hash[name[1..-1]] = instance_variable_get(name) }
  hash
end

Передача их в представление (github):

def view_context
  view_context_class.new(view_renderer, view_assigns, self)
end

Установка их в виде (github):

def assign(new_assigns) # :nodoc:
  @_assigns = new_assigns.each { |key, value| instance_variable_set("@#{key}", value) }
end