【问题标题】:Where are instance variables in a Rails helper module stored?Rails 辅助模块中的实例变量存储在哪里?
【发布时间】:2013-04-02 04:03:44
【问题描述】:

我正在关注的一个教程位于子目录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

【问题讨论】:

标签: ruby-on-rails railstutorial.org


【解决方案1】:

这个答案大致说明了实例变量如何在控制器和视图之间传递: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

【讨论】:

  • 所以在视图内部调用助手时,self 是view_context_class?它实际上是一个什么样的班级?谢谢。
  • 我猜是ActionView::Base:github.com/rails/rails/blob/…
  • 助手是一个模块,它与类相似,但与对象不同。不同之处在于模块在包含它的地方混合在一起。简单来说,这相当于将模块代码复制粘贴进去。所以,由于助手代码被粘贴到视图中,所以 self 是一个 view_context_class
猜你喜欢
  • 1970-01-01
  • 2022-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-30
相关资源
最近更新 更多