存储Rails帮助程序模块中的实例变量在哪里?

时间:2013-04-02 04:03:45

标签: ruby-on-rails railstutorial.org

我所关注的教程在子目录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

1 个答案:

答案 0 :(得分:2)

这个答案总体上讲述了如何在控制器和视图之间传递实例变量:How are Rails instance variables passed to views?

基本上,如果@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