我正在关注的教程在子目录app / helpers下面的SessionsHelper模块被许多控制器和视图使用.但实际变量current_user在首次创建时存储在哪里?存储对象的类是什么?
当控制器首先调用current_user方法时,将创建current_user实例变量.当一个视图然后调用current_user方法时,current_user实例变量是如何存在的?在渲染视图期间是否自动设置为控制器对象?
module SessionsHelper ... def current_user @current_user ||= User.find_by_remember_token(cookies[:remember_token]) end ... end
解决方法
这个答案总体上讲述了控制器和视图之间如何传递实例变量:
How are Rails instance variables passed to views?
所以基本上,如果@current_user由控制器设置,则该实例变量(以及所有其他变量)将从控制器上下文传递到视图上下文.如果没有由控制器设置,它将在视图第一次使用时设置.
有关更多信息,请参阅其他答案.这是一个很好的阅读.
Pasted from @mechanicalfish answer:
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