只是好奇是否有人知道在 Rails 框架中使用什么 Ruby 技术来完成以下任务。
如果我不在index
Rails 控制器上编写方法,如果 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 Jabnović 所指出的,我最初的心智模型是错误的。控制器方法通常不会渲染视图;相反,控制器方法和视图渲染都由一些框架代码调用。这很明显,因为我可以创建一个具有任何名称的控制器方法 - 例如,- 并且视图将被渲染。所以很明显,在这种情况下我并没有覆盖父方法,并且一些框架代码正在解析控制器方法名称并寻找匹配的视图。search
search
尽管如此,框架必须能够检测控制器方法是否已经调用render
。所以这对我来说是另一个小谜团。