2012-02-21 33 views
8

这是一个概念性问题,我一直没能找到答案,所以我在这里:为什么使用实例变量将控制器与视图“连接”?

为什么实例变量用于连接控制器和视图?我们没有两个不同类的两个不同的对象(Controller vs Views)。所以,当视图呈现时,我们处于不同的上下文中,但我们正在使用另一个对象的实例变量?这是不是破坏封装在某种程度上?

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

+1

@meggar,实际上,它直接使用变量。请参阅Ruby文档中的'BasicObject#instance_eval',您将看到如何做到这一点。另外检查'绑定'。 – 2012-02-21 21:27:16

回答

6

从某种意义上说,你可以说它正在破坏封装。我发现如果你不小心,很容易让你的商业/演示逻辑在Rails中混合在一起。它通常在我写视图模板时开始,并且发现我需要一些我没有从控制器传递过来的值。所以我回去,并调整控制器,以适应我所需要的视野。经过一次调整,另一次,另一次,你看看控制器的方法,它是设置各种实例变量,这是没有意义的,除非你看视图,看看他们是什么。所以你最终会遇到这样一种情况:你需要同时查看控制器和视图来理解,而不是单独采取一种或另一种。

我认为使用实例变量(和Binding技巧一起)只是一种简单的方法,无需事先声明参数(就像定义方法时那样),从控制器传递需要从控制器查看的任何值。没有声明意味着编写的代码更少,而当您想要重构和重组时,更少的代码需要更改。

4

Rails使用evalBinding将控制器实例变量传递给视图。请参阅this presentation from Dave Thomas,第46分钟处有一个小例子,说明这是如何完成的。

+0

如果我理解正确,OP指的是“@变量”,而绑定对发送变量部分(在本地)是有用的。有趣的东西,但。 – tokland 2012-12-12 12:16:36

相关问题