2008-10-09 10 views

Répondre

221

Dans vos vues faire 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 de résumer les content_for et yield(:title) énoncés dans les méthodes d'aide (comme les autres 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.

+6

Cette réponse est plus compliquée qu'elle ne devrait l'être et est probablement périmée pour Rails 3 maintenant. Je recommande la réponse d'opsb ci-dessous. –

+2

@Simon pouvez-vous expliquer pourquoi il est périmé (à côté de la syntaxe)? Comme ici [http://guides.rubyonrails.org/layouts_and_rendering.html#using-content_for] il est encore listé comme un exemple de sortie du titre. – lulalala

+1

@lulalala: Je pense que je me référais aux appels 'h' qui, je pense, ne sont plus nécessaires. Et c'est juste du code supplémentaire par rapport à la version d'opsb. Il est regrettable que son seul a 2 mises à jour par rapport à celui de 50. –

6

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

1) Mettez le titre dans l'un des vos pages de mise en page et consomment une méthode d'assistance stockées 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 une partie pour charger ce qui apparaît entre les balises HEAD

3) Utiliser javascript/ajax appelle à manipuler le DOM si vous avez besoin de changer le titre après l'événement de chargement.

Peut-être que vous ne voulez pas vraiment changer le contenu étiqueté par l'élément title. Peut-être avez-vous vraiment besoin d'une sorte de fil d'Ariane pour que vos utilisateurs sachent toujours où ils se trouvent par rapport à la hiérarchie de navigation de votre site. Bien que j'ai bien fait avec le plugin Goldberg, je suis sûr qu'il existe d'autres façons de tirer la même fonctionnalité.

48

La meilleure pratique consiste à utiliser content_for.

Tout d'abord, ajouter quelques méthodes d'aide (c.-à-coller 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 mise en page, vous pouvez simplement utiliser:

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

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

<%= page_heading "Awesome" %> 

Cette façon a l'avantage de vous permettre de mélanger où vous vous en tenez l'étiquette h1 pour votre titre, et garde votre contrôleur gentil et libre des variables pesky @title.

+4

Comment définit-on la valeur de '@ content_for_title'? –

+0

@JordanFeldstein Je n'ai aucune idée de ce qu'il voulait dire par '@ content_for_title'. Devrait être '(content_for (: title) + '—' si content_for? (: Title)). To_s + 'My Cool Site''. Ensuite, pour le définir, "<% content_for: title, 'Mon titre de page'%>' –

+1

'@ content_for_title' est ce qui se passait lorsque vous utilisiez' content_for', au moment où ce commentaire a été écrit. Je crois que ce n'est plus le cas, mais je n'ai pas regardé récemment. Le commentaire de Toby J est correct pour Rails d'aujourd'hui. Je vais mettre à jour ma réponse originale. – Aupajo

2

Vous pouvez également le définir dans un before_filter dans 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 les conditions dans la méthode set_title pour définir un titres différents pour les différentes actions dans le contrôleur. C'est agréable de pouvoir voir tous les titres de pages pertinents dans votre contrôleur.

+2

Il est (malheureusement) courant d'utiliser cette méthode, mais c'est une mauvaise habitude de mettre des titres de page dans votre contrôleur. Un titre de page est quelque chose de plus lié à la vue. Si vous offriez une vue alternative XML par exemple, quelle est la pertinence d'un titre de page? – Aupajo

+0

Oui, je suis d'accord que ce n'est pas une bonne idée mais c'est une alternative qui pourrait être utile dans certains cas où différents titres de pages doivent être créés à partir de conditions complexes. – JasonOng

+1

Hmm, je pense toujours que c'est quelque chose qui fait partie de l'aide à la vue. Ma règle est de regarder la version XML et voir si elle a besoin de cette variable ou non. Sinon, c'est quelque chose dont une vue individuelle a besoin. Rendez votre contrôleur aussi léger que possible. – Aupajo

-9

Je voudrais ajouter ma variante assez simple.

Dans la ApplicationController définissent 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 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.

+1

Je suppose que vous avez appris le concept de [séparation des préoccupations] (http : //en.wikipedia.org/wiki/Separation_of_concerns) au cours des six dernières années, mais je vais juste le mettre là pour d'autres qui pourraient être confus au sujet de pourquoi cette réponse a des points négatifs. – nurettin

109

est ici une simple option que je préfère 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 manière la mise en page et les modèles de page sont analysés le @ title = "Accueil" est évalué avant le rendu de la mise en page.

+2

C'est la solution la plus simple, et devrait être votée. –

+29

Il est à noter que cela ne fonctionnera pas avec la mise en cache de l'affichage des rails. Dans les rails 3 content_for est assez intelligent pour fonctionner correctement avec la mise en cache (voir la réponse sélectionnée). – opsb

+4

Aha, merci pour le conseil opsb. Je n'ai pas réalisé à propos des problèmes de mise en cache. –

3

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

<% title "Title of page" %>

Je peux aussi utilisateur <% title "Title of page", false %> avoir le titre juste montrer au titre du navigateur et pas dans la page elle-même.

0

La meilleure façon/propre à faire:

<title><%= @page_title or 'Page Title' %></title> 
17

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

En application.html.erb:

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

Dans le fichier erb de vue ou son contrôleur:

<% @title = "Unique Page Title" %> 
0
approche

pour le titrage de la page en utilisant la méthode content_for et un

1 partielle. nom partiel: _page_title.html.erb

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

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

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

3. Utilisation dans le fichier * .html.erb, à l'exception de l'application.html.erb Placez-le simplement dans n'importe quel fichier .html.Erb et le titre d'approvisionnement de la page

e.g : inside index.html.erb 

    <%=render '_page_title', title: 'title_of_page'%> 
0

En bref, je peux écrire cela comme suivre

<%content_for :page_title do %><%= t :page_title, "Name of Your Page" %> <% end %> 
0

J'aime la méthode de opSB, mais cette méthode fonctionne aussi.

<% provide(:title,"ttttttttttttttttttZ") %> 
<html> 
    <head><title><%= yield(:title) %></title></head> 
    <body></body> 
</html> 
+0

FWIW la méthode ici est la méthode utilisée dans le livre chapitre 3 de hartl, pas que je recommande ce livre car je trouve que c'est un peu compliqué à suivre mais de toute façon. – barlop

Questions connexes