2010-07-27 44 views
11

我已經離開Rails一段時間了,所以也許我錯過了一些簡單的東西。如果內容產生,就會渲染一些東西(Rails 3)

你怎麼能做到這一點:

<%= yield_or :sidebar do %> 
    some default content 
<% end %> 

甚至:

<%= yield_or_render :sidebar, 'path/to/default/sidebar' %> 

在第一種情況下,我想:

def yield_or(content, &block) 
    content_for?(content) ? yield(content) : yield 
end 

但是,拋出一個「不塊給出'錯誤。

在第二種情況:

def yield_or_render(content, template) 
    content_for?(content) ? yield(content) : render(template) 
end 

這工作時,有沒有定義的內容,但只要我使用content_for覆蓋默認的內容,它會引發同樣的錯誤。

我用this作爲起點,但它似乎只在直接在視圖中使用時才起作用。

謝謝!

回答

13

這樣的事情呢?

<% if content_for?(:whatever) %> 
    <div><%= yield(:whatever) %></div> 
<% else %> 
    <div>default_content_here</div> 
<% end %> 

Inspiration from this SO question

+0

看來,我會使用這種模式很多,所以我想把它提取到一個幫手中。 – Ivan 2010-07-27 21:29:34

0

我不知道,你可以使用content_for(:content_tag)無塊,它將返回相同的內容,如果使用yield(:content_tag)

所以:

def yield_or_render(content, template) 
    content_for?(content) ? content_for(content) : render(template) 
end 
5

試試這個:

# app/helpers/application_helper.rb 
def yield_or(name, content = nil, &block) 
    if content_for?(name) 
    content_for(name) 
    else 
    block_given? ? capture(&block) : content 
    end 
end 

,所以你可以做

<%= yield_or :something, 'default content' %> 

<%= yield_or :something do %> 
    block of default content 
<% end %> 

默認可以被覆蓋的地方

<%= content_for :something do %> 
    overriding content 
<% end %> 
+0

我也問過[這個問題](http://stackoverflow.com/q/7409646/305668),看看我能否更簡潔一些。 – tristanm 2011-09-13 23:22:03

+0

'yield_or',正是我所需要的。 – evanrmurphy 2012-03-04 03:36:18