Rails 3 - yield return或callback不会在视图中调用<%= yield(:sidebar)|| 渲染('shared/sidebar')%>

rza*_*zar 7 ruby yield ruby-on-rails ruby-on-rails-3

我正在将一个网站从Rails 2(最新)迁移到Rails 3(beta2).
使用Ruby 1.9.1p378Ruby 1.9.2dev进行测试(2010-04-05 trunk 27225)

陷入困境,我不知道哪一部分会运作良好.怀疑yield是问题,但不确切知道.

在我的布局文件中,我经常使用以下技术:

app/views/layouts/application.html.erb:

<%= yield(:sidebar) || render('shared/sidebar') %>
Run Code Online (Sandbox Code Playgroud)

例如,部分外观如下:

app/views/shared/_sidebar.html.erb:

<p>Default sidebar Content. Bla Bla</p>
Run Code Online (Sandbox Code Playgroud)

现在是关键部分的时候了!
在任何视图中,我想创建一个content_for块(可选).这可能包含一些HTML等示例,如下所示.如果设置了此块,则内部的pice HTML应该呈现application.html.erb.
如果没有,Rails应该shared/_sidebar.html.erb在右侧渲染Partial .

app/views/books/index.html.erb:

<% content_for :sidebar do %>
    <strong>You have to read REWORK, a book from 37signals!</strong>
<% end %>
Run Code Online (Sandbox Code Playgroud)

所以你有了这个主意.希望.这种技术在任何Rails 2.x应用程序中都运行良好.
现在,在Rails 3 (beta2)中,只有yieldPart正在运行.

|| render('shared/sidebar')
Run Code Online (Sandbox Code Playgroud)

or方将不会被处理的轨道或可能红宝石.

感谢您的投入和时间!

rza*_*zar 7

来自railscasts.com的Ryan Bates在第227- 升级到Rails 3第3部分中显示了一个解决方案content_for?()(视频播放时间为2:45分钟)

我想,这就是我们应该使用它的方式:

content_for?(:sidebar) ? yield(:sidebar) : render("shared/sidebar")
Run Code Online (Sandbox Code Playgroud)