如何将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。 自述文件对这个问题做了很好的说明。