【问题标题】:content_for vs yield in partialscontent_for 与部分产量
【发布时间】:2012-02-29 10:01:02
【问题描述】:

在带有 HAML (3.1.4) 的 rails 3.0 中我有

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

    .panel.top
      = yield :panel_top
    
    .content
      = yield
    
  2. 另一个partial将使用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 发行说明中的​​更改的说明。

您能否帮助在部分内部组织yielding 的最佳方式是什么?

【问题讨论】:

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


    【解决方案1】:

    从 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 应该会呈现错误的结果。

    【讨论】:

      猜你喜欢
      • 2011-04-06
      • 1970-01-01
      • 2013-02-26
      • 2015-01-20
      • 2017-06-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-08
      • 1970-01-01
      相关资源
      最近更新 更多