Rotaie: come modificare il titolo di una pagina?


160

Qual è il modo migliore per creare un titolo personalizzato per le pagine in un'app Rails senza utilizzare un plug-in?

Risposte:


244

Nelle tue opinioni fai qualcosa del genere:

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

Quanto segue va nel file di 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>

È anche possibile incapsulare le istruzioni content_fore yield(:title)nei metodi di supporto (come altri hanno già suggerito). Tuttavia, in casi semplici come questo mi piace inserire il codice necessario direttamente nelle viste specifiche senza helper personalizzati.


24
Ho unito questa risposta a quella seguente per creare un "titolo predefinito" per ogni pagina: <title><%= (yield(:title) + " - " unless yield(:title).blank?).to_s + "This is always shown" %></title>nel layout e <% content_for :title, "Conditional title" %>nelle viste.
Giovanni

1
Funziona perfettamente con Rails 5.2.0!
Stanimir Dimitrov,

1
Quando uso <h1><%= content_for(:title, "Title for specific page") %></h1>non vedo alcun output nel mio DOM (cioè non ho <h1></h1>contenuto). Tuttavia il mio <title>Title for specific page</title>funziona correttamente. Qualche idea?
JoshuaESummers

118

Ecco una semplice opzione che mi piace usare

Nel tuo layout

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

E nella parte superiore del modello di pagina (prima riga)

<% @title="Home" %>

A causa del modo in cui vengono analizzati il ​​layout e i modelli di pagina, @ title = "Home" viene valutato prima del rendering del layout.


32
Vale la pena notare che questo non funzionerà con la memorizzazione nella cache di Rails View. In rails 3 content_for è abbastanza intelligente da funzionare correttamente con la memorizzazione nella cache (vedi la risposta selezionata).
opsb,

4
le variabili non dovrebbero essere impostate all'interno del controller?

2
@SajjadMerchant in generale sono d'accordo, sì, le variabili dovrebbero essere impostate nel controller. In questo caso, tuttavia, il modello sembra più appropriato perché stai specificando un attributo specifico dell'aspetto della pagina. È anche possibile che un'azione del controller venga utilizzata da due diverse visualizzazioni (non che ciò accada molto spesso, lo sto usando per illustrare quanto il titolo sia strettamente legato a un determinato modello).
Opsb

50

È consigliabile utilizzare content_for.

Innanzitutto, aggiungi un paio di metodi di supporto (ad es. Stick in 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

Quindi nella vista del layout puoi semplicemente usare:

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

... e nella stessa vista:

<%= page_heading "Awesome" %>

In questo modo ha il vantaggio di permetterti di rimescolare dove si attacca il tag h1 per il tuo titolo e mantenere il controller piacevole e privo di fastidiose variabili @title.


4
Come si imposta il valore di @content_for_title?
Jordan Feldstein,

@JordanFeldstein Non ho idea di cosa intendesse @content_for_title. Dovrebbe essere (content_for(:title) + ' &mdash; ' if content_for?(:title)).to_s + 'My Cool Site'. Quindi, per impostarlo dal tuo punto di vista, basta<% content_for :title, 'My Page Title' %>
Tobias J

1
@content_for_titleè ciò che accadeva quando lo usavi content_for, al momento in cui questo commento è stato scritto. Credo che non sia più così, ma non ho guardato di recente. Il commento di Toby J è corretto per Rails di oggi. Aggiornerò la mia risposta originale.
Aupajo,

20

Un miglioramento su @opsb e una forma più completa di @FouZ :

In application.html.erb:

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

Nella vista del file erb o del suo controller:

<% @title = "Unique Page Title" %>


6

Senza ulteriori dettagli sul caso d'uso o sui requisiti che stai cercando di soddisfare, posso pensare a diverse alternative:

1) Cambia il titolo in una delle pagine del layout e utilizza un metodo di supporto memorizzato in application_helper.rb

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

Questo approccio ti darà un titolo unico per ogni pagina di layout.

2) Railscasts suggerisce di utilizzare un parziale per caricare ciò che appare tra i tag HEAD

3) Utilizzare le chiamate javascript / ajax per manipolare il DOM se è necessario modificare il titolo dopo l'evento load.

Forse non vuoi davvero cambiare il contenuto taggato titledall'elemento. Forse hai davvero bisogno di un pangrattato di qualche tipo, in modo che i tuoi utenti sappiano sempre dove si trovano rispetto alla gerarchia di navigazione del tuo sito. Mentre ho fatto bene con il plug-in goldberg, sono sicuro che ci sono altri modi per sfruttare la stessa funzionalità.


3

Uso "nifty_layout" di nifty_generator che fornisce una variabile del titolo che posso chiamare quindi sulla pagina usando:

<% title "Title of page" %>

Posso anche <% title "Title of page", false %>fare in modo che il titolo venga visualizzato solo nel titolo del browser e non nella pagina stessa.


2

Puoi anche impostarlo in un filtro antistante nel controller.

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

È quindi possibile impostare le condizioni nel metodo set_title per impostare titoli diversi per diverse azioni nel controller. È bello poter vedere tutti i titoli delle pagine pertinenti all'interno del controller.


2
È (purtroppo) una pratica comune usare in questo modo, ma è una cattiva pratica mettere i titoli delle pagine nel controller. Il titolo di una pagina è qualcosa di più legato alla vista. Se, ad esempio, dovessi offrire una vista alternativa XML, quale rilevanza ha un titolo di pagina?
Aupajo,

Sì, sono d'accordo sul fatto che non è una buona idea, ma tuttavia è un'alternativa che potrebbe essere utile in alcuni casi in cui diversi titoli di pagine devono essere nati da condizioni complesse?
JasonOng,

1
Hmm, penso ancora che sia qualcosa che appartiene come aiuto per la vista. La mia regola è guardare la versione XML e vedere se ha bisogno di quella variabile o no. Altrimenti, è qualcosa di cui ha bisogno una vista individuale. Rendi il tuo controller il più leggero possibile.
Aupajo,


0

approccio per il titolo della pagina usando il metodo content_for e un metodo parziale

1 nome parziale: _page_title.html.erb

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

2 Utilizzo in application.html.erb all'interno del tag del titolo

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

3 Utilizzo nei rispettivi * .html.erb escluso application.html.erb Basta incollarlo in qualsiasi .html.erb e fornire il titolo della pagina

    e.g : inside index.html.erb

    <%=render '_page_title', title: 'title_of_page'%>

0

In breve, posso scrivere questo come segue

<%content_for :page_title do %><%= t :page_title, "Name of Your Page" %> <% end %>

0

Mi piace il metodo di opsb, ma anche questo metodo funziona.

<% provide(:title,"ttttttttttttttttttZ") %>
<html>
  <head><title><%= yield(:title) %></title></head>
   <body></body>
</html>

FWIW il metodo qui è il metodo usato nel capitolo 3 del libro di hartl, non che raccomando quel libro perché lo trovo un po 'una seccatura da seguire, ma comunque.
barlop

-1

Il modo migliore / pulito per farlo:

<title><%= @page_title or 'Page Title' %></title>

-9

Vorrei aggiungere la mia variante piuttosto semplice.

In ApplicationController definire questo metodo:

  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

Dopodiché puoi chiamare get_title dal tag del titolo del tuo layout. Puoi definire un titolo più specifico per la tua pagina definendo la variabile @action_title_name nelle tue azioni.


1
Immagino che tu abbia imparato il concetto di separazione delle preoccupazioni negli ultimi sei anni, ma lo metterò semplicemente in evidenza per gli altri che potrebbero essere confusi sul perché questa risposta abbia ottenuto segni negativi.
Nurettin,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.