2010-06-17 13 views
68

¿Cuál es la forma correcta de establecer el título de la página en los carriles 3. Actualmente estoy haciendo lo siguiente:Carriles 3 - Forma ideal para establecer título de páginas

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 

¿Hay alguna otra forma mejor de hacer lo anterior?

+1

posible duplicado de [¿Cómo cambio el título de una página en los rieles?] (http://stackoverflow.com/questions/185965/how-do-i-change-the-title-of-a-page-in-rails) – Kevin

Respuesta

124

se podía un ayudante simple:

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

utilizarlo en su diseño:

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

entonces llamaremos a partir de las plantillas:

<% title "Your custom title" %> 

esperanza esto ayuda;)

+3

Muy elegante;) Pero probablemente necesite cambiar el ayudante: 'content_for : title, page_title.to_s' – Andrew

+4

Edité la respuesta para reflejar la sugerencia de Andrew (la solución de Andrea no funcionaría en los rieles 3) – kikito

+0

El problema es que esta respuesta es incorrecta. A menos que haya un mago aquí. Para que el título se establezca utilizando este método de ayuda, debe llamarse 'title' antes de <% = yield (: title)%>, y dado que este último está principalmente en el diseño, esto no funcionará. Las personas tienen problemas para entender esta respuesta: http://stackoverflow.com/questions/17770419/unable-to-create-a-helper-in-rails –

2

@akfalcon - Utilizo un estrategia similar, pero sin el ayudante ... Acabo de establecer el @título predeterminado en el controlador de la aplicación y luego uso, <% = @ title%> en mi diseño. Si deseo anular el título, lo configuro nuevamente en la acción del controlador como lo hace. No hay magia involucrada, pero funciona muy bien. Hago lo mismo para la meta descripción & palabras clave.

En realidad estoy pensando en moverlo a la base de datos para que un administrador pueda cambiar los títulos, etc. sin tener que actualizar el código de Rails. Puede crear un modelo de Página de título con contenido, acción y controlador. Luego crea un helper que encuentre el PageTitle para el controlador/acción que estás renderizando actualmente (usando las variables controller_name y action_name). Si no se encuentra ninguna coincidencia, entonces devuelva el valor predeterminado.

@apeacox - ¿hay algún beneficio de establecer el título en la plantilla? Creo que sería mejor colocarlo en el controlador ya que el título se relaciona directamente con la acción que se llama.

+6

No es una buena práctica establecer un título dentro de un controlador porque el primero es sobre Ver y el último es sobre lógica comercial. Por ejemplo, tener un controlador 'blog', es normal establecer un título de acuerdo con el post.title y no hay razón para hacer esto en el controlador, pero lo hace en plantilla o archivo de diseño –

40

Descubrí que la solución de apeacox no funcionaba para mí (en Rails 3.0.3).

En vez lo hice ...

En application_helper.rb:

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

En el diseño:

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

En la vista:

<% title "Page Title Only" %> 

O:

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

Nota, esto también nos permite comprobar la presencia de un título y establecer un título por defecto en caso de que la vista no se ha especificado una.

En la disposición que podemos hacer algo como:

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

'content_for? (: Title) | | 'Este es un título predeterminado' es más corto. – mjnissim

+2

Creo que lo que quiere en el diseño es: <% = content_for? (: Title)? yield (: title): 'Este es un título predeterminado'%>

+1

@mjnissim Eso devolvería "verdadero" si se establece un valor para el título. –

50

No hay necesidad de crear cualquier función/ayudante adicional. Deberías echarle un vistazo al the documentation.

En el diseño de la aplicación

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

En la disposición específica

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

También puede comprobar esta railscast. Creo que será muy útil y te dará un comienzo básico.

NOTA: En caso de que quiera páginas más dinámicas con pjax

3

Ésta es mi forma preferida de hacerlo:

application_helper.rb

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

views/layouts/aplicación .html.erb

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

config/lugares/en.yml

en: 
    site_name: "My Website" 

Esto tiene la ventaja agradable para siempre cae de nuevo al nombre del sitio en sus locales, que pueden traducirse en una base por idioma.

A continuación, en cada otra página (por ejemplo, en la página Acerca de.) Usted puede poner simplemente:

vistas/home/about.html.erb

<% title 'About' %> 

El título resultante para que página será:

Acerca de - Mi página Web

Simples :)

0

Tengo una solución algo más complicada. Quiero administrar todos mis títulos en mis archivos de configuración regional. También quiero incluir títulos significativos para mostrar y editar páginas de modo que el nombre del recurso esté incluido en el título de la página. Finalmente, quiero incluir el nombre de la aplicación en cada título de página, p. Editing user Gustav - MyApp.

Para lograr esto creo un ayudante en application_helper.rb que hace la mayor parte del trabajo pesado. Esto intenta obtener un nombre para la acción determinada del archivo de configuración regional, un nombre para el recurso asignado si hay uno y los combina con el nombre de la aplicación.

# 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 

Usted tendrá que añadir textos específicos de acción en sus archivos de traducción de la siguiente forma:

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

Y si desea utilizar los nombres de recursos significativos en sus puntos de vista singulares que puede ser necesario añadir un par de métodos proxy, por ejemplo

# User.rb 
def name 
    username 
end 
0

pensé que será bueno:

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

y dar un valor a @title en su controlador, o el título será Your title

+2

Simplificado: <% = @title o 'Title'%> WhyEnBe

1

Yo prefiero esta:

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 se llama a title sin argumentos, devuelve el valor actual del título o el predeterminado que en este ejemplo será "Ejemplo".

Se llama title con argumentos, lo establece en el valor pasado.

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

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

# config/locales/en.yml 
en: 
    site_name: "Example" 
0

Mi respuesta es más sencilla:

locales/any_archive.yml:

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

    groups: 
    title: 'Grupos' 

y en el interior de application.html.slim:

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

Hay una manera simple t o manipular las variables de diseño (título, descripción, 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' %> 

Y otras páginas tendrán App default title valor de sus títulos

0

en el diseño de la aplicación:

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

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

continuación, en cada vista, donde desea un título específico:

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

Ya hay Algunas buenas respuestas, pero agregaré mi enfoque simple. Agregue esto a los diseños/application.html

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

Usted automagicamente obtener un buen nombre en todos sus puntos de vista como "Mi sitio | Mensajes" - o lo que sea el controlador pasa a ser.

Por supuesto, puede opcionalmente establecer un título en una vista añadiendo:

- content_for(:title, 'About') 

y obtener un título como "Mi sitio | Acerca de".

+0

Y esto funciona en Rails 5. :) –

Cuestiones relacionadas