web-dev-qa-db-fra.com

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

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

Un exemple classique étant quelque chose comme:

<title><%= yield :page_title %></title>

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

<% content_for :page_title, "Something here" %>

Existe-t-il un moyen pour que la mise en page place 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 ne fait que doubler le texte. J'ai aussi essayé:

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

#default_page_title est un assistant de vue.

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

59
d11wtq

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

<% content_for :page_title do %>
    Awesome page
<% end %>
120
Dylan Markow

À 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:

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

Dans votre assistant 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:

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

Et dans vos vues, vous pouvez personnaliser avec:

<% page_title 'My Page Title' %>
12
Joshua Coady

Je viens de publier un nouveau bijou, 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/sinon) de vos vues.

Consultez le fichier Lisez-moi pour des exemples détaillés:

- no_content_for :key

  • Utilisez un tiret (-) différent de (=)
  • Empêchera un content_for ultérieur de s'afficher. Cela permet aux modèles de remplacer les mises en page.

= content_for_with_default :key

  • Utilisez un égal (=) et non un tiret (-)
  • Vous lui fournissez le HAML par défaut via un bloc ou un ensemble de paramètres qui sont les mêmes que vous passeriez à un appel de "rendu" standard (c'est-à-dire : partial => 'foo',: locals => {: bar => 'bar'}). `

= content_for :key

  • Utilisez un égal (=) et non 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 celui qui est rendu en premier gagne, donc si une mise en page a no_content_for ou content_for (avec ou sans valeur par défaut), le modèle peut maintenant le remplacer.
5
Peter H. Boling

Meilleure réponse pour Rails 3 ici:

Le rendement et la casse par défaut || ne sortent pas la casse par défaut

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

3
cyrilchampier