如何将Rails实例variables传递给视图?

在我的Rails应用程序中,我有一个像这样的控制器:

class MyController < ApplicationController def show @blog_post = BlogPost.find params[:id] end end 

在我看来,我可以简单地做到这一点:

 <%= @blog_post.title %> 

我对魔法感到不舒服。 这是如何实现的?

当呈现视图时,实例variables及其值从控制器中获取,并传递给视图初始化器,视图初始化器将其设置为视图实例。 这是使用这些ruby方法完成的:

instance_variables – 获取实例variables的名称( documentation ) instance_variable_get(variable_name) – 获取实例variables的值( documentation ) instance_variable_set(variable_name, variable_value) – 设置实例variables的值( documentation )

这里是Rails代码:

收集控制器实例variables( github ):

 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 

decent_exposure gem是Rails的标准控制器实例variables行为的替代scheme。 自述文件对这个问题做了很好的说明。