ruby-on-rails - Rails 实例变量如何传递给 View ?

标签 ruby-on-rails

在我的 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/

相关文章:

ruby-on-rails - 如何在Rails中将 "3.days"转换成字符串 "3 days"?

javascript - JQuery 选择器在 Ruby on Rails 中由 Ajax XHR 创建的表中的元素上找不到类

ruby-on-rails - Rails Upsert PG created_at 问题

ruby-on-rails - 无法运行 rake 测试 Rails

ruby-on-rails - 预期响应为 <redirect>,但为 <200>

mysql - rake db:migrate 失败并出现 Mysql2::Error: Row size Too Large

ruby-on-rails - 使用 scss、webpacker 和rails 的样式表顺序 6

ruby-on-rails - Rails 后台 worker 似乎被包裹在交易中

ruby-on-rails - 跨域用户认证

ruby-on-rails - Capybara + Selenium : How to select second item in Chosen. js 多选列表?