Rails 3 – moyen idéal pour définir le titre des pages

Quelle est la bonne façon de définir le titre de la page dans les rails 3. Actuellement, je fais ce qui suit:

app / views / layouts / application.html:

   

app / helpers / application_helper.rb:

 def render_title return @title if defined?(@title) "Generic Page Title" end 

app / controllers / some_controller.rb:

 def show @title = "some custom page title" end 

Y a-t-il une autre / meilleure façon de faire ce qui précède?

vous pourriez un simple assistant:

 def title(page_title) content_for :title, page_title.to_s end 

utilisez-le dans votre mise en page:

 < %= yield(:title) %> 

puis appelez-le à partir de vos modèles:

 < % title "Your custom title" %> 

J’espère que cela t’aides 😉

Il n’est pas nécessaire de créer une fonction / une aide supplémentaire. Vous devriez regarder la documentation .

Dans la mise en page de l’application

 < % if content_for?(:title) %> < %= content_for(:title) %> < % else %> Default title < % end %> 

Dans la mise en page spécifique

 < % content_for :title do %> Custom title < % end %> 

J’ai trouvé que la solution d’apeacox ne fonctionnait pas pour moi (dans Rails 3.0.3).

Au lieu de cela j’ai fait …

Dans application_helper.rb :

 def title(page_title, options={}) content_for(:title, page_title.to_s) return content_tag(:h1, page_title, options) end 

Dans la mise en page:

 < %= content_for(:title) %> 

Dans la vue:

 < % title "Page Title Only" %> 

OU:

 < %= title "Page Title and Heading Too" %> 

Notez que cela nous permet également de vérifier la présence d’un titre et de définir un titre par défaut dans les cas où la vue n’en a pas spécifié.

Dans la mise en page, nous pouvons faire quelque chose comme:

 < %= content_for?(:title) ? content_for(:title) : 'This is a default title' %> 

C’est ma façon préférée de le faire:

application_helper.rb

 module ApplicationHelper def title(*parts) content_for(:title) { (parts < < t(:site_name)).join(' - ') } unless parts.empty? end end 

vues / layouts / application.html.erb

  < %= content_for?(:title) ? yield(:title) : t(:site_name) %>  

config / locales / en.yml

 en: site_name: "My Website" 

Cela présente l'avantage de toujours revenir au nom du site dans vos parameters régionaux, ce qui peut être traduit par langue.

Ensuite, sur chaque autre page (par exemple, sur la page À propos), vous pouvez simplement mettre:

views / home / about.html.erb

 < % title 'About' %> 

Le titre résultant de cette page sera:

A propos de - Mon site web

Simples 🙂

@akfalcon – J’utilise une stratégie similaire, mais sans l’aide. Je viens de définir le @title par défaut dans le contrôleur d’application, puis d’utiliser < % = @ title%> dans ma mise en page. Si je veux remplacer le titre, je le redéfinis comme vous dans l’action du contrôleur. Pas de magie, mais ça marche très bien. Je fais la même chose pour la meta description et les mots-clés.

Je pense en fait à le déplacer dans la firebase database pour qu’un administrateur puisse changer les titres, etc. sans avoir à mettre à jour le code Rails. Vous pouvez créer un modèle de titre de page avec contenu, action et contrôleur. Créez ensuite un assistant qui trouve le titre de page pour le contrôleur / l’action que vous êtes en train de rendre (en utilisant les variables nom_contrôleur et nom_action). Si aucune correspondance n’est trouvée, renvoyez la valeur par défaut.

@apeacox – y a-t-il un avantage à définir le titre dans le modèle? Je pense qu’il serait préférable de le placer dans le contrôleur car le titre est directement lié à l’action appelée.

Je préfère ça:

 module ApplicationHelper def title(*page_title) if Array(page_title).size.zero? content_for?(:title) ? content_for(:title) : t(:site_name) else content_for :title, (Array(page_title) < < t(:site_name)).join(' - ') end end end 

Si title est appelé sans arguments, il renvoie la valeur actuelle du titre ou la valeur par défaut qui, dans cet exemple, sera "Example".

Le title est appelé avec des arguments, il le met à la valeur passée.

 # layouts/application.html.erb < %= title %> # views/index.html.erb < % title("Home") %> # config/locales/en.yml en: site_name: "Example" 

Vous pouvez également vérifier ce railcast . Je pense que ce sera très utile et vous donnera un début de base.

REMARQUE: Si vous souhaitez des pages plus dynamics avec pjax

J’ai une solution un peu plus compliquée. Je veux gérer tous mes titres dans mes fichiers de parameters régionaux. Je souhaite également inclure des titres significatifs pour les pages d’affichage et d’édition, de sorte que le nom de la ressource soit inclus dans le titre de la page. Enfin, je souhaite inclure le nom de l’application dans chaque titre de la page, par exemple Editing user Gustav - MyApp .

Pour ce faire, je crée un assistant dans application_helper.rb qui effectue le gros du travail. Cela essaie d’obtenir un nom pour l’action donnée à partir du fichier de parameters régionaux, un nom pour la ressource affectée s’il en existe une et les combine avec le nom de l’application.

 # Attempt to build the best possible page title. # If there is an action specific key, use that (eg users.index). # If there is a name for the object, use that (in show and edit views). # Worst case, just use the app name def page_title app_name = t :app_name action = t("titles.#{controller_name}.#{action_name}", default: '') action += " #{object_name}" if object_name.present? action += " - " if action.present? "#{action} #{app_name}" end # attempt to get a usable name from the assigned resource # will only work on pages with singular resources (show, edit etc) def object_name assigns[controller_name.singularize].name rescue nil end 

Vous devrez append des textes spécifiques à l’action dans vos fichiers de parameters régionaux sous la forme suivante:

 # en.yml titles: users: index: 'Users' edit: 'Editing' 

Et si vous souhaitez utiliser des noms de ressources significatifs dans vos vues singulières, vous devrez peut-être append quelques méthodes proxy, par exemple

 # User.rb def name username end 

Je pensais que ce serait bien:

  < % if @title %> < %= @title %> < % else %> Your title < % end %>  

Et donnez une valeur à @title dans votre contrôleur, ou le titre sera Your title

Ma réponse est plus simple:

locales / any_archive.yml :

 pt-BR: delivery_contents: title: 'Conteúdos de Entregas' groups: title: 'Grupos' 

Et à l’intérieur de l’ application.html.slim :

 title = "App Name: #{t("#{controller_name.underscore}.title")}" 

Il existe un moyen simple de manipuler les variables de mise en page (titre, description, etc.):

 # app/views/application.html.erb  < %= content_for :title || 'App default title' %>  # app/views/posts/index.html.erb < %= content_for :title, 'List of posts' %> 

Et d’autres pages auront une App default title pour leurs titres

Dans la mise en page de l’application:

 # app/views/layouts/application.html.erb < %= (yield :title) || 'General title' %> 

puis dans chaque vue où vous voulez un titre spécifique:

 < % content_for :title, 'Specific title' %> 

Il y a déjà de bonnes réponses, mais j’appendai mon approche simple. Ajoutez ceci aux layouts / application.html

 - if content_for?(:title) -title = "My site | #{content_for(:title)}" -else -title = "My site | #{controller_name.titleize}" 

Vous obtenez automatiquement de jolis noms sur toutes vos vues comme “Mon site | Messages” – ou peu importe le contrôleur.

Bien entendu, vous pouvez éventuellement définir un titre sur une vue en ajoutant:

 - content_for(:title, 'About') 

et obtenir un titre comme “Mon site | À propos”.