如何使控制器中的实例变量可用于Rails中的视图

我已经做了一段时间的Rails并且刚刚开始深入研究Rails从中获得力量的Ruby元编程。 我真的无法想出这个,它让我发疯。 如何在控制器中的实例变量可用于Rails中的视图(与视图共享)? 我知道它背后有一些元编程魔术,但我无法理解。请提前感谢你的所有帮助。

更新:原始接受的答案是错误的

我现在要离开它,以certificate我是多么的错。 在足够的downvotes之后,我决定研究它是如何实际工作的。 我的原始答案是在我对rails非常新的之后编写的,并且是基于我使用过的其他MVC库(特别是CodeIgniter)的假设。

它是如何工作的(从Rails 4开始)

AbstractControllerActionController::Base包含,您的ApplicationControllerinheritance自)包含一个名为view_assigns的方法。 此方法从控制器的上下文中获取所有(未受保护的)实例变量,并以散列forms返回它们。 此方法由ActionView::Base ( 此处 )的实例使用。

因此,基本上,实例变量通过一些元编程魔法通过哈希提供给您的视图。 您的视图绝对不会在控制器的上下文或范围内执行。 这就是为什么必须将控制器方法显式声明为辅助方法以使它们对视图可见的原因。 该function由单独的元编程层启用。

原(错)答案:

它并不是那么复杂或“元”。 ActionController#render方法执行当前ApplicationController实例范围内的模板代码(erb,haml,无论如何)。 这意味着模板中的所有代码都在ApplicationController中的方法内执行,因此可以访问其内部执行的对象的实例变量。

如果你不调用render那么ApplicationController将尝试根据动作名称找出要调用render模板。