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 %>
Où #default_page_title
est un assistant de vue.
Cela a juste laissé le bloc complètement vide.
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 %>
À 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' %>
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
= content_for_with_default :key
= content_for :key
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' %>