Ответ 1
Как насчет чего-то подобного?
<% if content_for?(:whatever) %>
<div><%= yield(:whatever) %></div>
<% else %>
<div>default_content_here</div>
<% end %>
Я давно не был в 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 для переопределения содержимого по умолчанию, он выдает ту же ошибку.
Я использовал этот в качестве отправной точки, но, похоже, он работает только при непосредственном использовании в представлении.
Спасибо!
Как насчет чего-то подобного?
<% if content_for?(:whatever) %>
<div><%= yield(:whatever) %></div>
<% else %>
<div>default_content_here</div>
<% end %>
Попробуйте следующее:
# 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 %>
Я не знал, что вы можете использовать content_for(:content_tag)
без блока, и он вернет тот же контент, что и при использовании yield(:content_tag)
.
Итак:
def yield_or_render(content, template)
content_for?(content) ? content_for(content) : render(template)
end