2010-07-27 2 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 

Но что бросает «нет block given 'error.

Во втором случае:

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

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

+0

'yield_or', именно то, что мне нужно. – evanrmurphy