在使用HAML(3.1.4)的rails 3.0中,我有
一些类似模板的部分,例如_template.html.haml:
.panel.top
= yield :panel_top
.content
= yield
另一个部分将使用prev模板显示(所有这些东西都是使用AJAX渲染的,但这没关系)
- content_for :panel_top do
.title.left
= title
content text
这就像Rails 3.0
中的魅力一样但是,升级到 3.2 后,这会失败! Yiels只会产生“内容文本”,所以我有两次“内容文本”,根本没有标题
仅将= yield :panel_top
更改为= content_for :panel_top
适用于3.2
我不确定此解决方案是否正常,如果它是稳定的或推荐的,我找不到有关yield
处理或Rails 3.1发行说明中的更改的注释,也不会发现3.2中的更改。
您能帮助组织yield
内部部分的最佳方式吗?
答案 0 :(得分:10)
从Rails 3.0到Rails 3.2 content_for
真的发生了变化:
<强> 3.0 强>:
def content_for(name, content = nil, &block)
content = capture(&block) if block_given?
@_content_for[name] << content if content
@_content_for[name] unless content
end
<强> 3.2 强>:
def content_for(name, content = nil, &block)
if content || block_given?
content = capture(&block) if block_given?
@view_flow.append(name, content) if content
nil
else
@view_flow.get(name)
end
end
这向我们展示了3.2 content_for
也可用于显示/插入内容,而不仅仅是为命名部分存储它。
此外,如果您尝试调试yield
逻辑,那么在正确初始化content_for
之前,它会产生它。
因此,将片段缓存保留在此讨论之外我可以得出结论,content_for
是首选方式,可以在除顶级布局之外的任何位置插入命名部分。在帮助者和其他情况下yield
会导致错误的结果。