Rails 3: rendement / content_for avec une valeur par défaut?

Existe-t-il un moyen de détecter si #content_for a réellement été appliqué à une marge de yield dans Rails?

Un exemple classique étant quelque chose comme:

  

Si un modèle ne le définit pas avec

  

Y a-t-il un moyen d’avoir la mise en page à la place?

J’ai essayé de le définir avec #content_for dans la mise en page elle-même, mais cela ne fait que doubler le texte. J’ai aussi essayé:

  

#default_page_title est une aide de vue.

Cela a juste laissé le bloc complètement vide.

Vous pouvez utiliser content_for? vérifier s’il existe du contenu avec un nom spécifique:

 < % if content_for?(:page_title) %> < %= yield(:page_title) %> < % else %> < %= default_page_title %> < % end %> 

ou

 < %= content_for?(:page_title) ? yield(:page_title) : default_page_title %> 

Ensuite, dans vos vues, vous pouvez spécifier le contenu comme

 < % content_for :page_title do %> Awesome page < % end %> 

A partir de Rails 3, yield() renvoie une chaîne vide s’il n’y avait pas de contenu pour la clé demandée, vous pouvez donc faire quelque chose comme ceci:

 < %= yield(:page_title).presence || 'Default Page Title' %> 

Dans votre aide d’application, si vous définissez:

 def page_title(title = nil) title ? content_for(:page_title) { title } : content_for(:page_title).presence end 

Ensuite, vous pouvez faire quelque chose comme ceci:

 < %= page_title or 'Default Page Title' %> 

Et dans votre avis, vous pouvez personnaliser avec:

 < % page_title 'My Page Title' %> 

Je viens de publier un nouveau joyau, dry_views , qui fournit des méthodes content_for améliorées.

L’avantage par rapport à la réponse acceptée est qu’il vous permet de supprimer toute logique (si / autre) de vos vues.

Voir le readme pour des exemples détaillés:

- no_content_for :key

  • Utilisez un tiret (-) pas égal (=)
  • Empêchera un contenu ultérieur de rendre. Cela permet de remplacer les gabarits des mises en page.

= content_for_with_default :key

  • Utilisez un égal (=) pas un tiret (-)
  • Vous lui fournissez le HAML par défaut via un bloc ou un ensemble de parameters identiques à ceux que vous passeriez à un appel standard “render” (c’est-à-dire: partial => ‘foo’,: locals => {: bar => ‘ bar ‘}). `

= content_for :key

  • Utilisez un égal (=) pas un tiret (-)
  • Vous lui fournissez un bloc, c’est-à-dire {render: partial => ‘foo’}, et il remplacera content_for_with_default. Il a la même priorité que no_content_for, donc, quel que soit le rendu obtenu en premier, si un modèle a no_content_for ou content_for (avec ou sans valeur par défaut), le modèle peut maintenant le remplacer.

Meilleure réponse pour les rails 3 ici:

Rendement et cas par défaut || ne pas sortir le cas par défaut

< %= yield(:title).presence || 'My Default Title' %>