2010-07-27 14 views
11

He estado alejado de Rails por un tiempo, entonces quizás me esté perdiendo algo simple.ceda si el contenido, render algo diferente (Rails 3)

¿Cómo se puede lograr esto:

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

O incluso:

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

En el primer caso, estoy tratando:

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

Pero eso lanza un 'no bloque dado 'error.

En el segundo caso:

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

Esto funciona cuando no hay contenido definido, pero tan pronto como yo uso content_for para anular el contenido predeterminado, se lanza el mismo error.

que utilizan this como punto de partida, pero parece que sólo funciona cuando se utiliza directamente en la vista.

Gracias!

Respuesta

13

¿Qué tal algo así?

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

Inspiration from this SO question

+0

Parece que voy a utilizar este patrón mucho, así que quería extraerlo en un ayudante. – Ivan

0

yo no sabía que se podía utilizar sin content_for(:content_tag) un bloque y ha de devolver el mismo contenido que si se utiliza yield(:content_tag).

Así:

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

Prueba esto:

# 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 

por lo que podría hacer

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

o

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

donde se puede anular el valor predeterminado usando

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

También he pedido a [esta cuestión] (http://stackoverflow.com/q/7409646/305668) para ver si puedo hacer esto más sucinta. – tristanm

+0

'yield_or', exactamente lo que necesitaba. – evanrmurphy

Cuestiones relacionadas