在我的 Rails 应用程序中,我有一个像这样的 Controller :
class MyController < ApplicationController
def show
@blog_post = BlogPost.find params[:id]
end
end
在我看来,我可以简单地这样做:
<%= @blog_post.title %>
我对魔法感到不舒服。这是如何实现的?
最佳答案
渲染 View 时,将从 Controller 中获取实例变量及其值,并将其传递给 View 初始值设定项, View 初始值设定项将它们设置为 View 实例。这是使用以下 ruby 方法完成的:
instance_variables
- 获取实例变量的名称 ( documentation )
instance_variable_get(variable_name)
- 获取实例变量的值 ( documentation )
instance_variable_set(variable_name, variable_value)
- 设置实例变量的值 ( documentation )
这是 Rails 代码:
收集 Controller 实例变量( 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
将它们传递给 View ( github ):
def view_context
view_context_class.new(view_renderer, view_assigns, self)
end
在 View 中设置它们 ( github ):
def assign(new_assigns) # :nodoc:
@_assigns = new_assigns.each { |key, value| instance_variable_set("@#{key}", value) }
end
关于ruby-on-rails - Rails 实例变量如何传递给 View ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18855178/