Sai*_*ner 6 ruby binding metaprogramming ruby-on-rails ruby-on-rails-3
我已经做了一段时间的Rails并且刚刚开始深入研究Rails从中获取力量的Ruby元编程.我真的无法想出这一个,它让我发疯.如何在控制器中的实例变量可用于Rails中的视图(与视图共享)?我知道它背后有一些元编程魔术,但我无法理解它.谢谢你的所有帮助.
我现在要离开它,以证明我是多么的错.经过足够的投票后,我决定调查一下这实际上是如何运作的.我的原始答案是在我对rails非常新的之后编写的,并且是基于我使用过的其他MVC库(特别是CodeIgniter)的假设.
AbstractController(ActionController::Base包括和你的ApplicationController继承)包括一个名为view_assigns的方法.此方法从控制器的上下文中获取所有(未受保护的)实例变量,并以散列形式返回它们.此方法由ActionView::Base(此处)的实例使用.
因此,基本上,实例变量通过一些元编程魔术通过哈希提供给您的视图.您的视图绝对不会在控制器的上下文或范围内执行.这就是为什么必须将控制器方法显式声明为辅助方法以使它们对视图可见的原因.该功能由单独的元编程层启用.
它并不是那么复杂或"元".该ActionController#render方法执行当前ApplicationController实例范围内的模板代码(erb,haml,无论如何).这意味着模板中的所有代码都在您的方法内执行ApplicationController,因此可以访问其内部执行的对象的实例变量.
如果您不调用,render那么ApplicationController将尝试render根据操作名称确定要调用的模板.