Rails:在布局内对应的“yield”之后使用“content_for”

时间:2010-01-08 09:57:34

标签: ruby-on-rails rendering yield delay

我认为之前已经提出这个问题,但即使我搜索了Google,我还没有提出解决方案。

所以这就是我在Rails 2.3.5中尝试做的事情:

layouts/application.html.erb:
<html>
  <head>
    ... some other stuff
    <%= yield :head %>
  </head>
  <body>
    <% content_for :head, "something that belongs in the head" %>
  </body>
</html>

注意之前的产量

我知道Rails - 默认情况下 - 不允许在使用 yield之后定义的内容 - 这是有意义的。

我甚至试图挂钩到模板渲染过程但到目前为止没有成功。

所以我的目标是能够在部分/模板中定义content_for,并在响应发送到浏览器之前以某种方式延迟和执行“yield”。

有人想出一个解决方案吗?

问候和感谢, 弗兰克

更新的 我会选择weppos的想法并尝试使用机架中间件。感谢

2 个答案:

答案 0 :(得分:13)

渲染过程首先加载并执行操作模板,然后使用选定的布局修饰模板。 布局从顶部渲染到底部,因此在:head已经渲染后,您无法向:head添加更多内容。

您需要更改策略。将片段放在局部并将其附加到您的操作视图或使用后处理策略(如Rack module / after_filter)直接更改html代码。

我可能会尝试根据实际需要找到更好的解决方案。如果您遇到此问题,可能是错误发生在其他地方,可能是在应用程序架构中。

答案 1 :(得分:7)

content_for声明中不应该有等号。它应该是:

<% content_for :head, "Something that belongs in the head" %>

如果您在模板和部分内容中定义内容,那么它应该有效。 Railscast episode 8中介绍了这种技术。