Rails: Como alterar o título de uma página?

160

Qual é a melhor maneira de criar um título personalizado para páginas em um aplicativo Rails sem usar um plug-in?

limpador
fonte

Respostas:

244

Na sua opinião, faça algo assim:

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

O seguinte está no arquivo de layout:

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

Também é possível encapsular as instruções content_fore yield(:title)nos métodos auxiliares (como outros já sugeriram). No entanto, em casos simples como este, eu gosto de inserir o código necessário diretamente nas visualizações específicas, sem auxiliares personalizados.

Christoph Schiessl
fonte
24
Mesclei esta resposta com a abaixo para criar um "título padrão" para cada página: <title><%= (yield(:title) + " - " unless yield(:title).blank?).to_s + "This is always shown" %></title>no layout e <% content_for :title, "Conditional title" %>nas visualizações.
John
1
Funciona perfeitamente com o Rails 5.2.0!
Stanimir Dimitrov
1
Quando uso <h1><%= content_for(:title, "Title for specific page") %></h1>, não vejo nada no meu DOM (ou seja, não tenho <h1></h1>conteúdo). No entanto, o meu <title>Title for specific page</title>está funcionando corretamente. Alguma ideia?
JoshuaESummers 24/03
118

Aqui está uma opção simples que eu gosto de usar

No seu layout

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

E na parte superior do seu modelo de página (primeira linha)

<% @title="Home" %>

Devido à maneira como o layout e os modelos de página são analisados, o @ title = "Home" é avaliado antes da renderização do layout.

opsb
fonte
32
Vale ressaltar que isso não funcionará com o cache de exibição de trilhos. No Rails 3, content_for é inteligente o suficiente para funcionar corretamente com o cache (veja a resposta selecionada).
opSB
4
variáveis ​​não devem ser definidas dentro do controlador?
2
@SajjadMerchant em geral, eu concordo, sim variáveis ​​devem ser definidas no controlador. Nesse caso, o modelo parece mais apropriado, porque você está especificando um atributo específico para a aparência da página. Também é possível que uma ação do controlador seja usada por duas visões diferentes (não que isso aconteça com muita frequência, estou usando-a para ilustrar o quão fortemente vinculado o título está a um modelo específico).
opSB
50

A melhor prática é usar o content_for.

Primeiro, adicione alguns métodos auxiliares (por exemplo, cole em 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

Em sua exibição de layout, você pode simplesmente usar:

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

... e na própria exibição:

<%= page_heading "Awesome" %>

Dessa forma, você tem a vantagem de permitir que você embaralhe onde coloca a tag h1 do seu título e mantém seu controlador agradável e livre de variáveis ​​@title irritantes.

Aupajo
fonte
4
Como se define o valor de @content_for_title?
Jordan Feldstein
@JordanFeldstein Não tenho idéia do que ele quis dizer @content_for_title. Deveria ser (content_for(:title) + ' &mdash; ' if content_for?(:title)).to_s + 'My Cool Site'. Então, para defini-lo da sua opinião, apenas<% content_for :title, 'My Page Title' %>
Tobias J
1
@content_for_titleé o que costumava acontecer quando você usava content_for, no momento em que este comentário foi escrito. Acredito que esse não seja mais o caso, mas não olhei recentemente. O comentário de Toby J está correto no Rails de hoje. Vou atualizar minha resposta original.
Aupajo
20

Uma melhoria no @opsb e uma forma mais completa do @FouZ 's:

Em application.html.erb:

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

No arquivo view erb ou em seu controlador:

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

Sem mais detalhes sobre o caso de uso ou os requisitos que você está tentando satisfazer, posso pensar em várias alternativas:

1) Mude o título em uma das suas páginas de layout e consuma um método auxiliar armazenado em application_helper.rb

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

Essa abordagem fornecerá um título exclusivo para cada página de layout.

2) O Railscasts sugere o uso de um parcial para carregar o que aparece entre as tags HEAD

3) Use chamadas javascript / ajax para manipular o DOM, se você precisar alterar o título após o evento de carregamento.

Talvez você realmente não queira alterar o conteúdo marcado pelo titleelemento. Talvez você realmente precise de algum tipo de trilha de navegação, para que seus usuários sempre saibam onde estão com relação à hierarquia de navegação do seu site. Embora tenha me saído bem com a forma como o plug-in goldberg, tenho certeza de que existem outras maneiras de obter a mesma funcionalidade.

Alan
fonte
3

Eu uso o "nifty_layout" de nifty_generator, que fornece uma variável de título que eu posso chamar na página usando:

<% title "Title of page" %>

Também posso usar <% title "Title of page", false %>o título para mostrar apenas no título do navegador e não na própria página.

enviado
fonte
2

Você também pode configurá-lo em um before_filter no seu 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>

Você pode então definir condições no método set_title para definir títulos diferentes para ações diferentes no controlador. É bom poder ver todos os títulos de páginas relevantes em seu controlador.

JasonOng
fonte
2
É (infelizmente) prática comum usar dessa maneira, mas é uma prática ruim colocar títulos de página no seu controlador. Um título de página é algo mais relacionado à exibição. Se você oferecesse uma exibição alternativa de XML, por exemplo, qual a relevância de um título de página?
Aupajo 9/10/08
Sim, eu concordo que não é uma boa idéia, mas, no entanto, é uma alternativa que pode ser útil em alguns casos em que diferentes títulos de páginas precisam nascer de condições complexas?
JasonOng
1
Hmm, eu ainda acho que é algo que pertence como ajudante da vista. Minha regra é olhar para a versão XML e ver se ela precisa dessa variável ou não. Caso contrário, é algo que uma visão individual precisa. Faça o seu controlador o mais leve possível.
Aupajo
0

abordagem para a titulação de páginas usando o método content_for e uma

1 nome parcial: _page_title.html.erb

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

2) Uso em application.html.erb na tag title

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

3) Uso no respectivo * .html.erb, excluindo application.html.erb Basta colocar isso em qualquer .html.erb e fornecer o título da página

    e.g : inside index.html.erb

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

Em resumo, posso escrever isso da seguinte maneira

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

Eu gosto do método opsb, mas esse método também funciona.

<% provide(:title,"ttttttttttttttttttZ") %>
<html>
  <head><title><%= yield(:title) %></title></head>
   <body></body>
</html>
barlop
fonte
FWIW, o método aqui é o método usado no capítulo 3 do livro de hartl, não que eu recomende esse livro, pois acho um pouco complicado de seguir, mas de qualquer maneira.
barlop
-1

A melhor maneira / limpa de fazer isso:

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

Gostaria de adicionar minha variante bastante simples.

No 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

Depois disso, você pode chamar get_title na tag de título do seu layout. Você pode definir um título mais específico para sua página, definindo a variável @action_title_name em suas ações.

IDBD
fonte
1
Eu acho que você aprendeu o conceito de separação de preocupações durante os últimos seis anos, mas vou divulgá-lo para outras pessoas que possam estar confusas sobre o porquê dessa resposta ter marcas negativas.
Nurettin