Rails: Comment changer le titre d'une page?

160

Quelle est la meilleure façon de créer un titre personnalisé pour des pages dans une application Rails sans utiliser de plug-in?

wusher
la source

Réponses:

244

Dans votre opinion, faites quelque chose comme ceci:

<% content_for :title, "Title for specific page" %>
<!-- or -->
<h1><%= content_for(:title, "Title for specific page") %></h1>

Ce qui suit va dans le fichier de mise en page:

<head>
  <title><%= yield(:title) %></title>
  <!-- Additional header tags here -->
</head>
<body>
  <!-- If all pages contain a headline tag, it's preferable to put that in the layout file too -->
  <h1><%= yield(:title) %></h1>
</body>

Il est également possible d'encapsuler les instructions content_foret yield(:title)dans des méthodes d'assistance (comme d'autres l'ont déjà suggéré). Cependant, dans des cas simples comme celui-ci, j'aime mettre le code nécessaire directement dans les vues spécifiques sans aide personnalisée.

Christoph Schiessl
la source
24
J'ai fusionné cette réponse avec celle ci-dessous pour créer un "titre par défaut" pour chaque page: <title><%= (yield(:title) + " - " unless yield(:title).blank?).to_s + "This is always shown" %></title>dans la mise <% content_for :title, "Conditional title" %>en page et dans les vues.
John
1
Fonctionne parfaitement avec Rails 5.2.0!
Stanimir Dimitrov
1
Lorsque j'utilise, <h1><%= content_for(:title, "Title for specific page") %></h1>je ne vois rien en sortie dans mon DOM (c'est-à-dire que je n'ai <h1></h1>aucun contenu). Cependant, mon <title>Title for specific page</title>fonctionne correctement. Des idées?
JoshuaESummers
118

Voici une option simple que j'aime utiliser

Dans votre mise en page

<head>
  <title><%= @title %></title>
</head>

Et en haut de votre modèle de page (première ligne)

<% @title="Home" %>

En raison de la façon dont la mise en page et les modèles de page sont analysés, @ title = "Home" est évalué avant le rendu de la mise en page.

opsb
la source
32
Il convient de noter que cela ne fonctionnera pas avec la mise en cache de la vue des rails. Dans les rails 3, content_for est suffisamment intelligent pour fonctionner correctement avec la mise en cache (voir la réponse sélectionnée).
opsb
4
les variables ne devraient-elles pas être définies à l'intérieur du contrôleur?
2
@SajjadMerchant généralement je suis d'accord, oui les variables doivent être définies dans le contrôleur. Dans ce cas, le modèle semble plus approprié car vous spécifiez un attribut spécifique à l'apparence de la page. Il est également possible qu'une action de contrôleur soit utilisée par deux vues différentes (pas que cela se produise très souvent, je l'utilise pour illustrer à quel point le titre est étroitement lié à un modèle particulier).
opsb
50

La meilleure pratique consiste à utiliser content_for.

Tout d'abord, ajoutez quelques méthodes d'assistance (par exemple, stick dans app / helpers / application_helper.rb):

def page_title(separator = " – ")
  [content_for(:title), 'My Cool Site'].compact.join(separator)
end

def page_heading(title)
  content_for(:title){ title }
  content_tag(:h1, title)
end

Ensuite, dans votre vue de mise en page, vous pouvez simplement utiliser:

<title><%= page_title %></title>

... et dans la vue elle-même:

<%= page_heading "Awesome" %>

Cette méthode a l'avantage de vous permettre de mélanger les emplacements où vous collez la balise h1 pour votre titre et de garder votre contrôleur agréable et exempt de variables @title embêtantes.

Aupajo
la source
4
Comment fixer la valeur de @content_for_title?
Jordan Feldstein
@JordanFeldstein Je n'ai aucune idée de ce qu'il voulait dire @content_for_title. Devrait être (content_for(:title) + ' &mdash; ' if content_for?(:title)).to_s + 'My Cool Site'. Ensuite, pour le définir de votre vue, juste<% content_for :title, 'My Page Title' %>
Tobias J
1
@content_for_titleest ce qui se passait lorsque vous utilisiez content_for, au moment où ce commentaire a été écrit. Je pense que ce n'est plus le cas, mais je n'ai pas regardé récemment. Le commentaire de Toby J est correct pour les Rails d'aujourd'hui. Je mettrai à jour ma réponse d'origine.
Aupajo
20

Une amélioration sur @opsb et une forme plus complète de @FouZ :

Dans application.html.erb:

<title><%= @title || "Default Page Title" %></title>

Dans le fichier view erb ou son contrôleur:

<% @title = "Unique Page Title" %>
boulder_ruby
la source
6

Sans plus de détails sur le cas d'utilisation ou les exigences que vous essayez de satisfaire, je peux penser à plusieurs alternatives:

1) Changez le titre dans l'une de vos pages de mise en page et utilisez une méthode d'aide stockée dans application_helper.rb

<title><%= custom_title %></title>

Cette approche vous donnera un titre unique pour chaque page de mise en page.

2) Railscasts suggère d'utiliser un partiel pour charger ce qui apparaît entre les balises HEAD

3) Utilisez des appels javascript / ajax pour manipuler le DOM si vous devez changer le titre après l'événement de chargement.

Peut-être que vous ne voulez pas vraiment changer le contenu étiqueté par l' titleélément. Peut-être avez-vous vraiment besoin d'un fil d'Ariane, afin que vos utilisateurs sachent toujours où ils se trouvent par rapport à la hiérarchie de navigation de votre site. Bien que je me sois bien débrouillée avec le plugin goldberg, je suis sûr qu'il existe d'autres moyens de tirer parti des mêmes fonctionnalités.

Alan
la source
3

J'utilise "nifty_layout" de nifty_generator qui fournit une variable de titre que je peux appeler ensuite sur la page en utilisant:

<% title "Title of page" %>

Je peux également utiliser <% title "Title of page", false %>pour afficher le titre dans le titre du navigateur et non dans la page elle-même.

envoyé-hil
la source
2

Vous pouvez également le définir dans un before_filter de votre contrôleur.

# foo_controller.rb

class FooController < ApplicationController

  before_filter :set_title

  private

  def set_title
    @page_title = "Foo Page"
  end

end

# application.html.erb

<h1><%= page_title %></h1>

Vous pouvez ensuite définir des conditions dans la méthode set_title pour définir des titres différents pour différentes actions dans le contrôleur. C'est bien de pouvoir voir tous les titres de page pertinents dans votre contrôleur.

JasonOng
la source
2
C'est (malheureusement) une pratique courante d'utiliser cette méthode, mais c'est une mauvaise pratique de mettre des titres de page dans votre contrôleur. Un titre de page est quelque chose de plus lié à la vue. Si vous proposez une vue alternative XML par exemple, quelle est la pertinence d'un titre de page?
Aupajo
Oui, je suis d'accord que ce n'est pas tout à fait une bonne idée, mais cependant c'est une alternative qui pourrait être utile dans certains cas où différents titres de page doivent être nés de conditions complexes?
JasonOng
1
Hmm, je pense toujours que c'est quelque chose qui fait partie d'une aide à la vue. Ma règle est de regarder la version XML et de voir si elle a besoin de cette variable ou non. Sinon, c'est quelque chose dont une vue individuelle a besoin. Rendez votre manette aussi légère que possible.
Aupajo
0

approche pour le titrage de page à l'aide de la méthode content_for et

1 . nom partiel: _page_title.html.erb

<%content_for :page_title do %>
 <%=title%>
<%end%>

2. Utilisation dans application.html.erb à l'intérieur de la balise title

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

3. Utilisation dans * .html.erb respectif à l'exclusion de l'application.html.erb Il suffit de coller ceci dans n'importe quel .html.erb et de fournir le titre de la page

    e.g : inside index.html.erb

    <%=render '_page_title', title: 'title_of_page'%>
Kofi Asare
la source
0

En bref, je peux l'écrire comme suit

<%content_for :page_title do %><%= t :page_title, "Name of Your Page" %> <% end %>
Mukesh Kumar Gupta
la source
0

J'aime la méthode d'opsb, mais cette méthode fonctionne aussi.

<% provide(:title,"ttttttttttttttttttZ") %>
<html>
  <head><title><%= yield(:title) %></title></head>
   <body></body>
</html>
barlop
la source
FWIW, la méthode ici est la méthode utilisée dans le chapitre 3 du livre de hartl, non pas que je recommande ce livre car je trouve que c'est un peu compliqué à suivre, mais de toute façon.
barlop
-1

La meilleure façon / propre de faire ceci:

<title><%= @page_title or 'Page Title' %></title>
FouZ
la source
-9

Je voudrais ajouter ma variante assez simple.

Dans ApplicationController, définissez cette méthode:

  def get_title
    @action_title_name || case controller_name
                            when 'djs'
                              'Djs'
                            when 'photos'
                              'Photos'
                            when 'events'
                              'Various events'
                            when 'static'
                              'Info'
                            when 'club'
                              'My club'
                            when 'news'
                              'News'
                            when 'welcome'
                              'Welcome!'
                            else
                              'Other'
                          end
  end

Après cela, vous pouvez appeler get_title à partir de la balise de titre de votre mise en page. Vous pouvez définir un titre plus spécifique pour votre page en définissant la variable @action_title_name dans vos actions.

IDBD
la source
1
J'imagine que vous avez appris le concept de séparation des préoccupations au cours des six dernières années, mais je vais simplement le présenter à d'autres qui pourraient ne pas savoir pourquoi cette réponse a obtenu des notes négatives.
nurettin