59 votes

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

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

Un exemple classique étant quelque chose comme :

<%= yield :page_title %>

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

<% content_for :page_title, "Quelque chose ici" %>

Existe-t-il un moyen pour que la mise en page mette quelque chose d'autre à la place ?

J'ai essayé de le définir avec #content_for dans la mise en page elle-même, mais cela provoque simplement une duplication du texte. J'ai aussi essayé :

<%= (yield :page_title) or default_page_title %>

#default_page_title est un helper de vue.

Cela a laissé le bloc complètement vide.

120voto

Dylan Markow Points 65796

Vous pouvez utiliser content_for? pour vérifier s'il y a 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 ceci :

<% content_for :page_title do %>
    Page géniale
<% end %>

13voto

Joshua Coady Points 544

Dès 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 || 'Titre de page par défaut' %>

Dans votre helper d'application, si vous définissez :

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

Alors vous pouvez faire quelque chose comme ceci :

<%= page_title or 'Titre de page par défaut' %>

Et dans vos vues, vous pouvez personnaliser avec :

<% page_title 'Mon titre de page' %>

5voto

Peter H. Boling Points 321

J'ai récemment publié une nouvelle gemme, dry_views, qui fournit des méthodes content_for améliorées.

Le bénéfice par rapport à la réponse acceptée est qu'elle vous permet de supprimer toute logique (if/else) de vos vues.

Consultez le readme pour des exemples approfondis:

- no_content_for :key

  • Utilisez un tiret (-) pas un égal (=)
  • Empêchera l'affichage ultérieur d'un contenu. Cela permet les remplacements de modèles de mises en page.

= content_for_with_default :key

  • Utilisez un égal (=) pas un tiret (-)
  • Vous devez lui fournir le HAML par défaut via un bloc ou un ensemble de paramètres que vous passeriez à un appel "render" standard (c'est-à-dire :partial => 'foo', :locals => {:bar => 'bar'}).`

= content_for :key

  • Utilisez un égal (=) pas un tiret (-)
  • Vous devez lui fournir 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 celui qui est rendu en premier l'emporte, donc si une mise en page a soit no_content_for ou content_for (avec ou sans défaut) le modèle peut maintenant le remplacer.

3voto

nerith Points 826

Meilleure réponse pour rails 3 ici :

Yield and default case || do not output default case

<%= yield(:title).presence || 'Mon titre par défaut' %>

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X