content_for 与部分产量

发布于 2025-01-04 04:12:55 字数 727 浏览 1 评论 0原文

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

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

    <前><代码>.panel.top = 产量:panel_top 。内容 = 产量
  2. 一些另一个部分将使用上一个模板显示(所有这些东西是使用 AJAX 渲染的,但这并不重要)

    - content_for :panel_top 做
     .title.左
       = 标题
    
    内容文本
    

,这在Rails中就像一个魅力< strong>3.0

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

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

我不确定这个解决方案是否可以,如果它稳定或推荐,我找不到任何有关 yield 处理中的更改的注释,也无法在 Rails 3.1 发行说明中找到,也无法在 Rails 3.1 发行说明中找到。 3.2 个。

你能帮忙解释一下在部分代码中组织yield的最佳方法是什么吗?

In rails 3.0 with HAML (3.1.4) I have

  1. some template-like partial, like _template.html.haml:

    .panel.top
      = yield :panel_top
    
    .content
      = yield
    
  2. some another partial which will be displayed using prev template (all this stuff is rendered using AJAX, but this doesn't matter)

    - content_for :panel_top do
     .title.left
       = title
    
    content text
    

and this worked like a charm in Rails 3.0

But, after upgrade to 3.2 this fails! Yiels just yields "content text", so I have "content text" twice and no title at all

only changing = yield :panel_top to = content_for :panel_top works for 3.2

I am not sure that this solution is ok, and if it is stable or recommended, I cannot find any notes about changes in yield processing nor in Rails 3.1 release notes, nor in 3.2 ones.

Can you help what is the best way to organize yielding inside partials?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

一个人练习一个人 2025-01-11 04:12:55

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

From Rails 3.0 to Rails 3.2 content_for was really changed:

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

This shows us, that from 3.2 content_for works for showing/inserting content too, not only store it for named section.

Also, if you make an attempt to debug yield logic you'll se that it yields before content_for is correctly initialized.

So, leaving fragment caching out of this discussion I can conclude that content_for is preferrable way to insert named sections anywhere except top-level layouts. In helpers and other situations yield should render wrong results.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文