引用 Rails 3 中的 Obie Fernandez 的话:
Rails 实现控制器到视图数据切换的方式是通过实例变量。通常,控制器操作会初始化一个或多个实例变量。然后视图可以使用这些实例变量。
在选择实例变量以在控制器和视图之间共享数据时存在一些讽刺意味(对于新手来说可能会感到困惑)。实例变量存在的主要原因是对象(无论是 Controller 对象、String 对象等)可以保留它们不与其他对象共享的数据。当你的控制器动作被执行时,一切都发生在控制器对象的上下文中——例如,DemoController 或 EventController 的一个实例。上下文包括代码中的每个实例变量都属于控制器实例的事实。
渲染视图模板时,上下文是不同对象的上下文,即 ActionView::Base 的实例。该实例有自己的实例变量,并且无法访问控制器对象的变量。
因此,从表面上看,实例变量对于两个对象共享数据的方式来说是最糟糕的选择。然而,有可能让它发生——或者让它看起来发生。Rails 所做的是遍历控制器对象的变量,并为每个变量创建一个视图对象的实例变量,具有相同的名称并包含相同的数据。
对于框架来说,这是一种劳动密集型的工作:就像手动复制购物清单一样。但最终的结果是,对于程序员来说,事情变得更容易了。如果您是 Ruby 纯粹主义者,您可能会因为实例变量用于连接对象而不是分离对象而感到畏缩。另一方面,作为一个 Ruby 纯粹主义者还应该理解这样一个事实,即您可以在 Ruby 中做很多不同的事情——比如在循环中复制实例变量。所以没有什么真正不像Ruby的。从程序员的角度来看,它确实在控制器和它正在呈现的模板之间提供了无缝连接。