8

这是一个概念性问题,我无法在 SO 中找到答案,所以我开始了:

为什么要使用实例变量来连接控制器和视图?难道我们没有两个不同类的两个不同对象(控制器与视图)。那么,当视图被渲染时,我们处于不同的上下文中,但我们使用的是另一个对象的实例变量?这不是以某种方式破坏封装吗?

Rails 如何做到从一个对象到另一个对象的匹配?它是否将控制器的所有实例变量克隆到视图中?

4

2 回答 2

6

从某种意义上说,你可以说它打破了封装。我发现,如果您不小心,很容易在 Rails 中将您的业务/表示逻辑混合在一起。它通常在我编写视图模板时开始,并发现我需要一些我没有从控制器传递的值。所以我回去,调整控制器以适应我在视图中的需要。在一次又一次调整之后,您查看控制器方法,它正在设置各种没有意义的实例变量,除非您查看视图以了解它们的用途。因此,您最终会遇到需要同时查看控制器和视图以了解其中一个的情况,而不是能够孤立地采用其中一个或另一个。

我认为使用实例变量(连同Binding技巧)只是一种将您需要的任何值从控制器传递到视图的方法,而无需提前声明参数(就像定义方法时一样)。没有声明意味着要编写更少的代码,并且在您想要重构和重组事物时更改更少。

于 2012-02-21T21:25:21.743 回答
4

Rails 使用evalBinding将控制器实例变量传递给视图。请参阅Dave Thomas 的此演示文稿,第 46 分钟有一个小示例解释了这是如何完成的。

于 2012-02-21T21:07:41.450 回答