2010-01-08 80 views
11

我认为这已经被问过,但即使我搜索了Google,我还没有想出解决方案。Rails:使用“content_for”后布局内相应的“yield”

原来这就是我想用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> 

注意的content_for前的产量

我知道Rails默认情况下不允许在使用收益后定义头部的内容- 这是合理的。

我甚至试图挂钩到模板渲染过程,但迄今没有成功。

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

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

问候和感谢, 弗兰克

更新 我会weppos的想法去尝试自己机架中间件。谢谢

回答

13

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

你需要改变你的策略。将片段放入局部片段中并将其附加到动作视图中,或使用后处理策略(如Rack模块/ after_filter)直接更改html代码。

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

7

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

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

如果您定义模板和部分内的内容,那么它应该工作。该技术已在Railscast episode 8中进行了介绍。