Rails 3 – yield return或callback不会在视图中调用
我正在将一个网站从Rails 2(最新)迁移到Rails 3(beta2)。
使用Ruby 1.9.1p378和Ruby 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