partial_for和部分产量

时间:2012-02-07 22:59:42

标签: ruby-on-rails ruby-on-rails-3 haml

在使用HAML(3.1.4)的rails 3.0中,我有

  1. 一些类似模板的部分,例如_template.html.haml:

    .panel.top
      = yield :panel_top
    
    .content
      = yield
    
  2. 另一个部分将使用prev模板显示(所有这些东西都是使用AJAX渲染的,但这没关系)

    - content_for :panel_top do
     .title.left
       = title
    
    content text
    
  3. 这就像Rails 3.0

    中的魅力一样

    但是,升级到 3.2 后,这会失败! Yiels只会产生“内容文本”,所以我有两次“内容文本”,根本没有标题

    仅将= yield :panel_top更改为= content_for :panel_top适用于3.2

    我不确定此解决方案是否正常,如果它是稳定的或推荐的,我找不到有关yield处理或Rails 3.1发行说明中的​​更改的注释,也不会发现3.2中的更改。

    您能帮助组织yield内部部分的最佳方式吗?

1 个答案:

答案 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会导致错误的结果。