web-dev-qa-db-fra.com

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 Rails 3. Actuellement, je fais ce qui suit:

app/views/layouts/application.html:

<head>
  <title><%= render_title %></title>
  <%= csrf_meta_tag %>

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

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

70
akfalcon

vous pourriez un simple assistant:

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

utilisez-le dans votre mise en page:

<title><%= yield(:title) %></title>

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

<% title "Your custom title" %>

j'espère que cela t'aides ;)

130
Andrea Pavoni

Il n'est pas nécessaire de créer une fonction/aide supplémentaire. Vous devriez jeter un oeil sur la documentation .

Dans la mise en page de l'application

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

Dans la mise en page spécifique

<% content_for :title do %>
  <title>Custom title</title>
<% end %>
52
griable

J'ai trouvé que la solution 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:

<title><%= content_for(:title) %></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:

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

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

views/layouts/application.html.erb

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

config/locales/en.yml

en:
  site_name: "My Website"

Cela présente l’avantage de Nice de toujours revenir au nom du site dans vos paramètres régionaux, qui peut être traduit langue par langue.

Ensuite, sur toutes les autres pages (par exemple, sur la page À propos de), vous pouvez simplement mettre:

views/home/about.html.erb

<% title 'About' %>

Le titre résultant pour cette page sera:

À propos - Mon site

Simples :)

3
DaniG2k

@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 présentation. Si je veux remplacer le titre, je le configure à nouveau dans l'action du contrôleur, comme vous le faites. Aucune magie impliquée, mais cela fonctionne très bien. Je fais la même chose pour la méta description et les mots clés. 

Je pense en fait à le déplacer dans la base de données afin qu'un administrateur puisse modifier les titres, etc. sans avoir à mettre à jour le code Rails. Vous pouvez créer un modèle PageTitle avec un contenu, une action et un contrôleur. Créez ensuite un assistant qui trouve le PageTitle du contrôleur/de l’action que vous êtes en train de restituer (à l’aide des 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 concerne directement l’action appelée.

2
johnmcaliley

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 argument, il renvoie la valeur actuelle de title ou la valeur par défaut qui, dans cet exemple, sera "Exemple".

title est appelé avec des arguments, il le définit sur la valeur transmise.

# layouts/application.html.erb
<title><%= title %></title>

# views/index.html.erb
<% title("Home") %>

# config/locales/en.yml
en:
  site_name: "Example"
1
Mark Murphy

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

NOTE: Si vous voulez des pages plus dynamiques avec pjax

0
Dobromir Minchev

Dans la mise en page de l'application:

# app/views/layouts/application.html.erb

<title><%= (yield :title) || 'General title' %></title>

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

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

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

# app/views/application.html.erb
<title>
  <%= content_for :title || 'App default title' %>
</title>

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

Et les autres pages auront la valeur App default title pour leurs titres

0
itsnikolay

Il y a déjà de bonnes réponses, mais je vais ajouter mon approche simple. Ajoutez ceci à layouts/application.html

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

Vous obtenez automatiquement les noms Nice sur toutes vos vues, tels que "Mon site | Messages" - ou quel que soit le contrôleur.

Vous pouvez bien sûr éventuellement définir un titre sur une vue en ajoutant:

- content_for(:title, 'About')

et obtenez un titre du type "Mon site | À propos de".

0
Dennis Best

Je pensais que ce serait bien:

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

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

0
Randy

J'ai une solution un peu plus compliquée. Je veux gérer tous mes titres dans mes fichiers de paramètres 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 page, par exemple. Editing user Gustav - MyApp.

Pour ce faire, je crée un assistant dans application_helper.rb qui effectue la plupart des tâches lourdes. Ceci tente d'obtenir un nom pour l'action donnée à partir du fichier de paramètres régionaux, un nom pour la ressource affectée s'il en existe un et les combine avec le nom d'application .

# Attempt to build the best possible page title.
# If there is an action specific key, use that (e.g. 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 ajouter des textes d'action spécifiques dans vos fichiers de paramètres 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 uniques, vous devrez peut-être ajouter quelques méthodes proxy, par exemple.

# User.rb
def name
  username
end
0
ronan_mac

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 application.html.slim :

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