7

我正在将网站从 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') %>

例如,部分看起来像:

app/views/shared/_sidebar.html.erb

<p>Default sidebar Content. Bla Bla</p>

现在是关键部分的时候了!
在任何视图中,我都想创建一个content_for块(可选)。这可以包含下面的 HTML 等示例。如果设置了这个块,里面的图片 HTML 应该呈现在application.html.erb. 如果没有,Rails 应该在右侧
渲染 Partial 。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)中,只有yieldPart 工作。

|| render('shared/sidebar')

侧面不会通过or导轨或红宝石处理。

感谢您的投入和时间!

4

4 回答 4

7

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

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

content_for?(:sidebar) ? yield(:sidebar) : render("shared/sidebar")
于 2010-09-06T19:29:43.080 回答
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>

它仍然很丑,但少了一点:)

于 2010-09-21T09:45:20.260 回答
3

我对此进行了测试,看起来 Rails 3 返回的是空字符串而不是 nil。因此,除非他们在最终版本之前更改此设置,否则您将不得不修改您的代码以查看该值是否为空而不是 nil。

(sidebar = yield(:sidebar)).present? ? sidebar : render("shared/sidebar")
于 2010-04-10T13:43:22.683 回答
3

谢谢迈克·多特勒。我接受了你的想法并对其进行了一些修改。

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

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

提供 vs content_for

于 2013-02-11T16:21:26.033 回答