13

我正在关注的教程在子目录app/helpers中包含以下 SessionsHelper 模块,该模块被许多控制器和视图使用。但是第一次创建实例变量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
4

1 回答 1

4

这个答案大致说明了实例变量是如何在控制器和视图之间传递的: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
于 2015-07-25T13:42:41.500 回答