2010-04-09 41 views
7

我正在从Rails 2(最新版本)迁移到Rails 3(beta2)。
测试与红宝石1.9.1p378红宝石1.9.2dev(2010-04-05干线27225)Rails 3 - yield return或callback不会在视图中调用<%= yield(:sidebar)|| render('shared/sidebar')%>

的情况下卡住了,我不知道哪一部分将工作做好。怀疑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处理。

感谢您的输入和时间!

回答

7

Ryan Bates from railscasts。COM显示情节#227 - Upgrading to Rails 3 Part 3(2:45敏视频回放)与content_for?()解决

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

content_for?(:sidebar) ? yield(:sidebar) : render("shared/sidebar") 
+1

这是这么脏 – 2010-09-17 03:40:37

3

我测试了这一点,它看起来像Rails 3返回空字符串,而不是零。因此,除非他们在最终版本发布之前改变了这一点,否则您将不得不修改您的代码以查看该值是否为空而不是零。

(sidebar = yield(:sidebar)).present? ? sidebar : render("shared/sidebar") 
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> 

它仍然是丑陋的,但有点少:)

相关问题