Rails使用什么Ruby技术来使我的控制器方法呈现视图?

Nat*_*ong 11 ruby ruby-on-rails internals

只是好奇是否有人知道在Rails框架中使用什么Ruby技术来完成以下操作.

如果我不在indexRails控制器上编写一个方法,如果URL匹配该路由,Rails仍将呈现索引视图文件.这是有道理的,因为我的控制器继承自父类,父类必须有自己的index方法.

但是,如果我做的定义index方法,并且只告诉它设置一个实例变量,但它仍然呈现相应的视图.例如:

def index
  @weasels = Weasel.all

  # If I omit this line, Rails renders the index anyway.
  # If this behavior is defined in the parent class's index method,
  # it seems that by overriding the method, my index wouldn't do it. 
  # I'm not explicitly calling super to get the method from 
  # ActionController::Base, but maybe Rails is doing something like that?
  render :index
end
Run Code Online (Sandbox Code Playgroud)

在纯Ruby中,我希望必须调用super才能获得该行为.

我假设Rails使用某种元编程技术来保证我的控制器方法会调用super.如果是这样,有人可以解释一下吗?你能指出这样做的源代码吗?

更新

正如MladenJablanović指出的那样,我最初的心理模型是错误的; 控制器方法通常不呈现视图; 相反,两个控制器方法视图的渲染被一些框架代码调用.这很明显,因为我可以创建一个具有任何名称的控制器方法 - 例如,search- 并且search视图将被渲染.很明显,在这种情况下,我没有覆盖父方法,并且一些框架代码正在解析控制器方法名称并寻找匹配的视图.

但是,框架必须能够检测控制器方法是否已经调用render.这对我来说是另一个小谜.

rye*_*guy 6

在控制器上,有一个名为的方法render_for_text.这需要一个字符串并将结果设置为响应主体.即使您不渲染为文本,渲染视图文件也只是读取文件的内容,对其进行评估,然后将其传递给render_for_text方法.该方法然后存储设置一个名为@performed_renderto 的实例变量true,它告诉rails控制器已经呈现了一个视图.

然后调用一个方法performed?来指示是否已调用渲染动作.它通过检查是否做到这一点@performed_render或者@performed_redirect是真实的.

有了上面的信息,渲染方法的第一行现在应该有意义,并希望回答你的问题:

raise DoubleRenderError, "Can only render or redirect once per action" if performed?