2011-05-07 139 views
55

有什麼方法可以檢測#content_for是否實際應用於Rails中的yield作用域?Rails 3:yield/content_for有一些默認值?

一個典型的例子中是這樣的:

<title><%= yield :page_title %></title> 

如果模板不設置與

<% content_for :page_title, "Something here" %> 

有沒有一種方法,以使佈局把別的東西,而不是有?

我試圖用#content_for在佈局中定義它,但這只是使文本翻倍。我也試過:

<%= (yield :page_title) or default_page_title %> 

#default_page_title是一個視圖助手。

這只是將塊完全留空。

回答

113

您可以使用content_for?來檢查是否有內容具有特定名稱:

<% if content_for?(:page_title) %> 
    <%= yield(:page_title) %> 
<% else %> 
    <%= default_page_title %> 
<% end %> 

<%= content_for?(:page_title) ? yield(:page_title) : default_page_title %> 

然後在你的意見,你可以指定一個像

<% content_for :page_title do %> 
    Awesome page 
<% end %> 
+0

你肯定能! :) 謝謝。 – d11wtq 2011-05-07 16:12:08

+2

content_for?(:title)|| '這是一個默認的標題'是更短的和工作;)以及:content_for:page_title,'Awesome Page' – alex 2014-01-21 11:37:30

+4

'<%= yield(:title).presence || '默認標題'%>'是更好的解決方法。 – 2015-07-16 13:14:59

5
內容

我剛剛發佈了一個新的創業板,dry_views,它提供了enhanc ed content_for方法。

對接受的答案的好處是它允許您從視圖中刪除所有邏輯(if/else)。

見自述進行廣泛的例子:

- no_content_for :key

  • 使用破折號( - )不是等號(=)
  • 將防止以後content_for無法呈現。這允許佈局的模板覆蓋。

= content_for_with_default :key

  • 使用一個等號(=)不破折號( - )
  • 你提供它經由塊一組中的相同則params的默認HAML將傳遞給一個標準的 「渲染」 呼叫(即:局部=> '富',:當地人=> {:巴=> '巴'})`

= content_for :key

  • 使用等號(=)不破折號( - )
  • 你爲它提供一個塊,即{渲染:局部=> '富'},並且將覆蓋content_for_with_default。它具有與no_content_for相同的優先級,因此無論哪個都是首先獲勝,所以如果佈局具有no_content_for或content_for(有或沒有默認值),則模板現在可以覆蓋它。
8

鐵軌的3,yield()的回報,如果有對所請求的鍵值沒有內容,所以你可以做這樣的事情空字符串:

<title><%= yield(:page_title).presence || 'Default Page Title' %></title> 

在你的應用助手,如果你定義:

def page_title(title = nil) 
    title ? content_for(:page_title) { title } : content_for(:page_title).presence 
end 

然後,你可以做這樣的事情:

<title><%= page_title or 'Default Page Title' %></title> 

而在你的觀點,你可以自定義:

<% page_title 'My Page Title' %>