【发布时间】:2011-05-28 06:59:59
【问题描述】:
只是好奇是否有人知道在 Rails 框架中使用什么 Ruby 技术来完成以下任务。
如果我不在 Rails 控制器上编写 index 方法,如果 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
在纯 Ruby 中,我希望必须调用 super 才能获得这种行为。
我假设 Rails 使用某种元编程技术来保证我的控制器方法将调用super。如果是这样,任何人都可以解释一下吗?您能指出执行此操作的源代码吗?
更新
正如 Mladen Jablanović 所指出的,我最初的心智模型是错误的;控制器方法通常不会渲染视图;相反,both 控制器方法和 视图渲染都由一些框架代码调用。这很明显,因为我可以使用任何名称创建控制器方法 - 例如,search - 并且 search 视图将被渲染。所以很明显,在这种情况下我并没有覆盖父方法,并且一些框架代码正在解析控制器方法名称并寻找匹配的视图。
不过,框架必须能够检测到控制器方法是否已经调用了render。所以这对我来说是另一个小谜。
【问题讨论】:
-
我看不出
super有什么关系?我可以在控制器中定义我想要的任何方法,我不会覆盖任何现有的方法。然而,正确的视图将被隐式渲染。 -
@Mladen Jablanović - 好点。因此,控制器方法必须由其他代码调用,这些代码记下名称并查找匹配的视图。
-
必须。不熟悉 Rails 架构,但我希望一些调度程序接受用户的请求,计算要调用的控制器/动作,调用适当的方法(如果已定义),并使用适当的视图来呈现输出(如果没有显式调用
render)。 -
@skaffman - 我打算使用“how-does-it-work”标签来区分关于如何完成某事的问题和关于幕后发生的事情的问题。我认为这适用于试图揭开框架工作原理的问题,并且我认为该标签对于浏览这种性质的问题很有用。我个人希望看到更多此类问题,尤其是关于 Rails 的问题。我要重新添加标签。如果您认为这是一个坏主意,请您发表评论解释原因吗?
-
也许
internals标签比较合适。
标签: ruby-on-rails ruby internals