Rieles: ¿Cómo cambiar el título de una página?

160

¿Cuál es la mejor manera de crear un título personalizado para páginas en una aplicación Rails sin usar un complemento?

wusher
fuente

Respuestas:

244

En su opinión, haga algo como esto:

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

Lo siguiente va en el archivo de diseño:

<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>

También es posible encapsular las declaraciones content_fory yield(:title)en métodos auxiliares (como ya han sugerido otros). Sin embargo, en casos simples como este, me gusta poner el código necesario directamente en las vistas específicas sin ayudantes personalizados.

Christoph Schiessl
fuente
24
Combiné esta respuesta con la siguiente para crear un "título predeterminado" para cada página: <title><%= (yield(:title) + " - " unless yield(:title).blank?).to_s + "This is always shown" %></title>en el diseño y <% content_for :title, "Conditional title" %>en las vistas.
John
1
¡Funciona perfecto con Rails 5.2.0!
Stanimir Dimitrov
1
Cuando lo uso <h1><%= content_for(:title, "Title for specific page") %></h1>, no veo nada en mi DOM (es decir, no tengo <h1></h1>contenido). Sin embargo mi <title>Title for specific page</title>está funcionando correctamente. ¿Algunas ideas?
JoshuaESummers
118

Aquí hay una opción simple que me gusta usar

En su diseño

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

Y en la parte superior de la plantilla de tu página (primera línea)

<% @title="Home" %>

Debido a la forma en que se analizan el diseño y las plantillas de página, se evalúa el @ title = "Inicio" antes de representar el diseño.

opsb
fuente
32
Vale la pena señalar que esto no funcionará con el almacenamiento en caché de vista de rieles. En los rieles 3 content_for es lo suficientemente inteligente como para funcionar correctamente con el almacenamiento en caché (ver la respuesta seleccionada).
opsb
44
¿No deberían establecerse variables dentro del controlador?
2
@SajjadMerchant en general estoy de acuerdo, sí, las variables deben establecerse en el controlador. En este caso, la plantilla se siente más apropiada porque está especificando un atributo específico para la apariencia de la página. También es posible que una acción del controlador sea utilizada por dos vistas diferentes (no es que esto suceda muy a menudo, la estoy usando para ilustrar qué tan unido está el título a una plantilla en particular).
opsb
50

La mejor práctica es usar content_for.

Primero, agregue un par de métodos de ayuda (es decir, pegue en 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

Luego, en su vista de diseño, simplemente puede usar:

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

... y en la vista misma:

<%= page_heading "Awesome" %>

De esta manera, tiene la ventaja de permitirle barajar donde pegue la etiqueta h1 para su título, y mantiene su controlador agradable y libre de molestas variables @title.

Aupajo
fuente
44
¿Cómo se establece el valor de @content_for_title?
Jordan Feldstein
@JordanFeldstein No tengo idea de a qué se refería @content_for_title. Debe ser (content_for(:title) + ' &mdash; ' if content_for?(:title)).to_s + 'My Cool Site'. Luego, para establecerlo desde su punto de vista, solo<% content_for :title, 'My Page Title' %>
Tobias J
1
@content_for_titlees lo que solía suceder cuando lo usabas content_for, en el momento en que se escribió este comentario. Creo que este ya no es el caso, pero no he mirado recientemente. El comentario de Toby J es correcto para los Rails de hoy. Actualizaré mi respuesta original.
Aupajo
20

Una mejora en @opsb y una forma más completa de @FouZ :

En application.html.erb:

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

En el archivo view erb o su controlador:

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

Sin más detalles sobre el caso de uso o los requisitos que está tratando de satisfacer, puedo pensar en varias alternativas:

1) Cambie el título en una de sus páginas de diseño y consuma un método auxiliar almacenado en application_helper.rb

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

Este enfoque le dará un título único para cada página de diseño.

2) Railscasts sugiere usar un parcial para cargar lo que aparece entre las etiquetas HEAD

3) Use las llamadas javascript / ajax para manipular el DOM si necesita cambiar el título después del evento de carga.

Tal vez realmente no quieras cambiar el contenido etiquetado por el titleelemento. Tal vez realmente necesite una ruta de exploración de algún tipo, para que sus usuarios siempre sepan dónde están con respecto a la jerarquía de navegación de su sitio. Si bien lo hice bien con el complemento goldberg, estoy seguro de que hay otras formas de lograr la misma funcionalidad.

Alan
fuente
3

Utilizo "nifty_layout" de nifty_generator que proporciona una variable de título que puedo llamar en la página usando:

<% title "Title of page" %>

También puedo utilizar <% title "Title of page", false %>el título para que solo se muestre en el título del navegador y no en la página en sí.

enviado
fuente
2

También puede configurarlo en un before_filter en su controlador.

# 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>

Luego puede establecer condiciones en el método set_title para establecer diferentes títulos para diferentes acciones en el controlador. Es bueno poder ver todos los títulos de página relevantes dentro de su controlador.

JasonOng
fuente
2
Es (desafortunadamente) una práctica común usar de esta manera, pero es una mala práctica poner títulos de página en su controlador. El título de una página es algo más relacionado con la vista. Si ofreciera una vista alternativa XML, por ejemplo, ¿qué relevancia tiene el título de una página?
Aupajo
Sí, estoy de acuerdo en que no es una buena idea, pero sin embargo, ¿es una alternativa que podría ser útil en algunos casos en los que los diferentes títulos de página deben nacer en condiciones complejas?
JasonOng
1
Hmm, sigo pensando que es algo que pertenece como ayudante para la vista. Mi regla es mirar la versión XML y ver si necesita esa variable o no. Si no, es algo que necesita una vista individual. Haga que su controlador sea lo más ligero posible.
Aupajo
0

enfoque para la titulación de páginas utilizando el método content_for y un parcial

1) nombre parcial: _page_title.html.erb

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

2) Uso en application.html.erb dentro de la etiqueta de título

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

3) Uso en los respectivos * .html.erb excluyendo application.html.erb Solo pegue esto en cualquier .html.erb y proporcione el título de la página

    e.g : inside index.html.erb

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

En resumen, puedo escribir esto de la siguiente manera

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

Me gusta el método opsb, pero este método también funciona.

<% provide(:title,"ttttttttttttttttttZ") %>
<html>
  <head><title><%= yield(:title) %></title></head>
   <body></body>
</html>
barlop
fuente
FWIW, el método aquí es el método utilizado en el capítulo 3 del libro de Hartl, no es que recomiendo ese libro, ya que me resulta un poco difícil de seguir, pero de todos modos.
barlop
-1

La mejor / limpia manera de hacer esto:

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

Me gustaría agregar mi variante bastante simple.

En el ApplicationController, defina este método:

  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

Después de eso, puede llamar a get_title desde la etiqueta de título de su diseño. Puede definir un título más específico para su página definiendo la variable @action_title_name en sus acciones.

BID
fuente
1
Supongo que has aprendido el concepto de separación de preocupaciones durante los últimos seis años, pero lo expondré para otros que podrían estar confundidos acerca de por qué esta respuesta obtuvo calificaciones negativas.
nurettin