2010-04-09 46 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> 

它仍然是醜陋的,但有點少:)

相關問題