2010-07-27 6 views
11

J'ai été absent de Rails pendant un moment maintenant, alors peut-être qu'il me manque quelque chose de simple.céder si c'est du contenu, de faire quelque chose autrement (Rails 3)

Comment pouvez-vous y parvenir:

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

Ou encore:

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

Dans le premier cas, je suis en train:

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

Mais cela jette un « non bloc donné 'erreur.

Dans le second cas:

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

Cela fonctionne quand il n'y a pas de contenu défini, mais dès que je l'utilise content_for pour remplacer le contenu par défaut, il jette la même erreur. J'ai utilisé this comme point de départ, mais il semble que cela ne fonctionne que lorsqu'il est utilisé directement dans la vue.

Merci!

Répondre

13

Que diriez-vous de quelque chose comme ceci?

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

Inspiration from this SO question

+0

Il semblerait que j'utiliserais beaucoup ce modèle, donc je voulais l'extraire en aide. – Ivan

0

je ne savais pas que vous pouvez utiliser content_for(:content_tag) sans bloc et il retournera le même contenu que si vous utilisez yield(:content_tag).

Alors:

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

Essayez ceci:

# 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 

vous pourriez donc faire

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

ou

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

où la valeur par défaut peut être remplacée en utilisant

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

J'ai aussi demandé [cette question] (http://stackoverflow.com/q/7409646/305668) pour voir si je peux rendre ceci plus succinct. – tristanm

+0

'yield_or', exactement ce dont j'avais besoin. – evanrmurphy

Questions connexes