我正在将网站从Rails 2(最新)迁移到Rails 3(beta2) 使用 Ruby 1.9.1p378 和 Ruby 1.9.2dev (2010-04-05主干27225)进行测试
陷入困境,我不知道哪一部分会运作良好。怀疑yield
是问题所在,但确实不知道。
在我的布局文件中,我经常使用以下技术:
app/views/layouts/application.html.erb
:
<%= yield(:sidebar) || render('shared/sidebar') %>
例如,部分外观如下:
app/views/shared/_sidebar.html.erb
:
<p>Default sidebar Content. Bla Bla</p>
现在是关键部分的时候了!
在任何视图中,我想创建一个content_for
块(可选)。这可能包含一些HTML等示例,如下所示。如果设置了此块,则内部的pice HTML应在application.html.erb
中呈现
如果没有,Rails应该在右侧的shared/_sidebar.html.erb
渲染部分。
app/views/books/index.html.erb
:
<% content_for :sidebar do %>
<strong>You have to read REWORK, a book from 37signals!</strong>
<% end %>
所以你有了主意。希望。这种技术在任何Rails 2.x应用程序中都运行良好
现在,在 Rails 3 (beta2)中,只有yield
部分正在运行。
|| render('shared/sidebar')
or
方不会通过rails或ruby进行处理。
感谢您的投入和时间!
答案 0 :(得分:7)
来自railscasts.com的Ryan Bates在剧集#227 - Upgrading to Rails 3 Part 3中显示content_for?()
的解决方案(视频播放时间为2:45分)
我认为,这就是我们应该使用它的方式:
content_for?(:sidebar) ? yield(:sidebar) : render("shared/sidebar")
答案 1 :(得分:3)
我测试了这个,看起来Rails 3返回空字符串而不是nil。因此,除非他们在最终版本发布之前对其进行更改,否则您必须修改代码以查看该值是否为空而不是仅为零。
(sidebar = yield(:sidebar)).present? ? sidebar : render("shared/sidebar")
答案 2 :(得分:3)
我通常将网站标题设置为:
<title><%= ['My Site', yield(:title)].compact.join(' - ') %></title>
由于这种变化,添加一些条件会很难看,所以我创建了一个这样的帮手:
module ApplicationHelper
def nil_empty(str)
str.blank? ? nil : str
end
end
然后我可以做类似的事情:
<title><%= ['My Site', nil_empty(yield :title)].compact.join(' - ') %></title>
它仍然很难看,但有点少:)
答案 3 :(得分:3)
感谢Mike Dotterer。我接受了你的想法并对其进行了一些修改。
yield(:sidebar).presence || render("shared/sidebar")
object.presence is equivalent to object.present? ? object : nil