Risposte:
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_for
e 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.
<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?
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.
È 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.
@content_for_title
?
@content_for_title
. Dovrebbe essere (content_for(:title) + ' — ' if content_for?(:title)).to_s + 'My Cool Site'
. Quindi, per impostarlo dal tuo punto di vista, basta<% content_for :title, 'My Page Title' %>
@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.
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" %>
Cerca in content_for
: http://railscasts.com/episodes/8
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 title
dall'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à.
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.
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.
Io uso questo pluginquesti aiutanti di Rails che ho scritto: http://web.archive.org/web/20130117090719/http://henrik.nyh.se/2007/11/my-rails-title-helpers/
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'%>
In breve, posso scrivere questo come segue
<%content_for :page_title do %><%= t :page_title, "Name of Your Page" %> <% end %>
Mi piace il metodo di opsb, ma anche questo metodo funziona.
<% provide(:title,"ttttttttttttttttttZ") %>
<html>
<head><title><%= yield(:title) %></title></head>
<body></body>
</html>
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.
<title><%= (yield(:title) + " - " unless yield(:title).blank?).to_s + "This is always shown" %></title>
nel layout e<% content_for :title, "Conditional title" %>
nelle viste.