Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

yield if content, render something otherwise (Rails 3)

I've been away from Rails for a while now, so maybe I'm missing something simple.

How can you accomplish this:

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

Or even:

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

In the first case, I'm trying:

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

But that throws a 'no block given' error.

In the second case:

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

This works when there's no content defined, but as soon as I use content_for to override the default content, it throws the same error.

I used this as a starting point, but it seems it only works when used directly in the view.

Thanks!

like image 461
Ivan Avatar asked Jul 27 '10 19:07

Ivan


2 Answers

How about something like this?

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

Inspiration from this SO question

like image 155
Jesse Wolgamott Avatar answered Oct 16 '22 21:10

Jesse Wolgamott


Try this:

# 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

so you could do

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

or

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

where the default can be overridden using

<%= content_for :something do %>
    overriding content
<% end %>
like image 45
tristanm Avatar answered Oct 16 '22 22:10

tristanm