Rails 3 - yield return或callback不会在视图中调用<%= yield(:sidebar)||渲染('shared / sidebar')%>

时间:2010-04-09 22:11:25

标签: ruby-on-rails ruby yield ruby-on-rails-3

我正在将网站从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进行处理。

感谢您的投入和时间!

4 个答案:

答案 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

provide vs content_for