在我的Rails应用程序中,我有一个这样的控制器:
class MyController < ApplicationController
def show
@blog_post = BlogPost.find params[:id]
end
end
Run Code Online (Sandbox Code Playgroud)
在我看来,我可以这样做:
<%= @blog_post.title %>
Run Code Online (Sandbox Code Playgroud)
我对魔法感到不舒服.这是如何实现的?
mec*_*ish 81
在呈现视图时,从控制器中拾取实例变量及其值,并将其传递给视图初始化程序,后者将它们设置为视图实例.这是使用这些ruby方法完成的:
instance_variables- 获取实例变量的名称(文档)
instance_variable_get(variable_name)- 获取实例变量的值(文档)
instance_variable_set(variable_name, variable_value)- 设置实例变量的值(文档)
这是Rails代码:
收集控制器实例变量(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
Run Code Online (Sandbox Code Playgroud)
将它们传递给视图(github):
def view_context
view_context_class.new(view_renderer, view_assigns, self)
end
Run Code Online (Sandbox Code Playgroud)
在视图中设置它们(github):
def assign(new_assigns) # :nodoc:
@_assigns = new_assigns.each { |key, value| instance_variable_set("@#{key}", value) }
end
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
15457 次 |
| 最近记录: |