rza*_*zar 7 ruby yield ruby-on-rails ruby-on-rails-3
我正在将一个网站从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:
<%= 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方将不会被处理的轨道或可能红宝石.
感谢您的投入和时间!
来自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)