Títulos de páginas do Rails com a quantidade certa de magia

Eu usei quase todas as gemas de título de página existentes. Nenhum era perfeito. Meu título de página ideal do Rails:

  • funciona quase sem código
  • tem padrões sãos
  • não requer gema
  • funciona no Rails 2, 3 e 4 (diabos, 5 também!)
  • é totalmente compatível com I18n

E caramba , encontrei uma configuração perfeita!

Construídas em

Todos nós vimos isso:

content_for?(:title) ? yield(:title) : "Example"

o que é ótimo, mas não flexível. Queremos I18n. E para 90% dos títulos das minhas páginas, eles são estáticos, não quero ter nenhuma linha na minha visão.

Estou pensando em algo assim:

t("#{ controller_path.tr('/', '.') }.#{ action_name }.title")

no meu layout que irá procurar uma chave de tradução preguiçoso como Rails foi construído em Eles começam com um ponto.: .t('.title')

Isso me permite colocar quase todos os títulos de minha página estática no arquivo local:

# config/en.yml
en
:
products
:
index
:
title
: "All products"

Mas sempre há aquela ação incômoda de show de produto onde você quer o nome do produto no título. Afinal, tenho que alimentar o monstro SEO. Equipe, lutei durante anos para encontrar a solução mais limpa. Passei por pântanos, minha busca me levou às profundezas de Ruby, C e – sim – Java. Mas eu perseverei. E hoje equipe apresento minha solução. Fique em meus ombros. Subir!

Passo 1

Primeiro, criaremos um auxiliar antiquado para ajudar a manter nossa visão limpa.

module ApplicationHelper

def title
if content_for?(:title)
# allows the title to be set in the view by using t(".title")
content_for
:title
else
# look up translation key based on controller path, action name and .title
# this works identical to the built-in lazy lookup
t
("#{ controller_path.tr('/', '.') }.#{ action_name }.title", default: :site_name)
end
end

end

Ótimo. Agora

Passo 2

colocamos aquele bad boy no layout do aplicativo:

<title><%= title %></title> <!-- see what I did? I made ERB clean! HOLY SHIT! -->
%title= title # haml. still bad ass.

title = title # slim, baby.

etapa 3

Coloque títulos estáticos no arquivo local. Use a convenção lazy-i18n, sua chave se chama title:

en:
products
:
index
:
title
: "All our products"

Passo 4

Se quisermos colocar algo dinâmico no título, use content_forem um arquivo de visualização:

<%= content_for :title, t(".title", name: @product.name) %>

e adicione o i18n correspondente:

en:
products
:
show
:
title
: "Choose %{name}!"

É isso, xerife.