Выход, если контент, сделать что-то другое (Rails 3)

Я давно не был в Rails, так что, возможно, мне не хватает чего-то простого.

Как вы можете это сделать:

<%= 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 для переопределения содержимого по умолчанию, он выдает ту же ошибку.

Я использовал этот в качестве отправной точки, но, похоже, он работает только при непосредственном использовании в представлении.

Спасибо!

Ответ 2

Попробуйте следующее:

# 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 %>

Ответ 3

Я не знал, что вы можете использовать content_for(:content_tag) без блока, и он вернет тот же контент, что и при использовании yield(:content_tag).

Итак:

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