gpt4 book ai didi

ruby-on-rails - Rails 使用什么 Ruby 技术让我的 Controller 方法呈现 View ?

转载 作者:数据小太阳 更新时间:2023-10-29 06:44:21 24 4
gpt4 key购买 nike

只是想知道是否有人知道在 Rails 框架中使用什么 Ruby 技术来完成以下任务。

如果我不在 Rails Controller 上编写一个 index 方法,如果 URL 匹配该路由,Rails 仍会呈现索引 View 文件。这是有道理的,因为我的 Controller 继承自父类,它必须有自己的 index 方法。

但是,如果我确实定义了一个index方法,并且只告诉它设置一个实例变量,它仍然会呈现适当的 View 。例如:

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 使用某种元编程技术来保证我的 Controller 方法将调用 super。如果是这样,谁能解释一下?你能指出执行此操作的源代码吗?

更新

正如 Mladen Jablanović 所指出的,我最初的心智模型是错误的; Controller 方法通常不渲染 View ;相反, Controller 方法 View 渲染都由一些框架代码调用。这是显而易见的,因为我可以创建一个具有任何名称的 Controller 方法——例如,search——然后​​将呈现 search View 。很明显,在那种情况下我没有覆盖父方法,一些框架代码正在解析 Controller 方法名称并寻找匹配的 View 。

不过,框架必须能够检测 Controller 方法是否已经调用了render。所以这对我来说是另一个小谜团。

最佳答案

在 Controller 上,有一个方法叫做render_for_text。 .这需要一个字符串并将结果设置为响应主体。即使您不呈现为文本,呈现 View 文件也只是读取文件的内容,对其求值,然后将其传递给 render_for_text 方法。然后该方法将一个名为 @performed_render 的实例变量设置为 true,这会告诉 Rails Controller 已经渲染了一个 View 。

然后有一个方法叫做 performed?指示渲染操作是否已被调用。它通过检查 @performed_render@performed_redirect 是否为真来执行此操作。

根据以上信息,very first line of the render method现在应该说得通了,希望能回答您的问题:

如果执行,引发 DoubleRenderError,“每次操作只能呈现或重定向一次”?

关于ruby-on-rails - Rails 使用什么 Ruby 技术让我的 Controller 方法呈现 View ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4490508/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com