Rails 3 – yield return或callback不会在视图中调用

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

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

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

app/views/layouts/application.html.erb

  

例如,局部看起来像:

app/views/shared/_sidebar.html.erb

 

Default sidebar Content. Bla Bla


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

app/views/books/index.html.erb

  You have to read REWORK, a book from 37signals!  

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

 || render('shared/sidebar') 

or侧面不会通过铁轨或ruby处理。

感谢您的投入和时间!

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

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

 content_for?(:sidebar) ? yield(:sidebar) : render("shared/sidebar") 

我测试了这个,看起来Rails 3返回空字符串而不是nil。 因此,除非他们在最终版本之前更改此内容,否则您将不得不修改代码以查看值是否为空而不是仅为零。

 (sidebar = yield(:sidebar)).present? ? sidebar : render("shared/sidebar") 

我通常设置我的网站标题:

 <%= ['My Site', yield(:title)].compact.join(' - ') %> 

由于这种变化,添加一些条件会很难看,所以我创建了一个这样的帮手:

 module ApplicationHelper def nil_empty(str) str.blank? ? nil : str end end 

然后我可以这样做:

 <%= ['My Site', nil_empty(yield :title)].compact.join(' - ') %> 

它仍然很难看,但有点少:)

谢谢Mike Dotterer。 我接受了你的想法并对其进行了一些修改。

 yield(:sidebar).presence || render("shared/sidebar") 

object.presence等同于object.present? ? 对象:无

提供vs content_for