Schienen: Wie ändere ich den Titel einer Seite?

160

Was ist der beste Weg, um einen benutzerdefinierten Titel für Seiten in einer Rails-App zu erstellen, ohne ein Plug-In zu verwenden?

wusher
quelle

Antworten:

244

Machen Sie aus Ihrer Sicht Folgendes:

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

Folgendes ist in der Layoutdatei enthalten:

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

Es ist auch möglich, die Anweisungen content_forund yield(:title)in Hilfsmethoden zu kapseln (wie andere bereits vorgeschlagen haben). In einfachen Fällen wie diesem möchte ich jedoch den erforderlichen Code ohne benutzerdefinierte Helfer direkt in die spezifischen Ansichten einfügen.

Christoph Schiessl
quelle
24
Ich habe diese Antwort mit der folgenden zusammengeführt, um einen "Standardtitel" für jede Seite zu erstellen: <title><%= (yield(:title) + " - " unless yield(:title).blank?).to_s + "This is always shown" %></title>im Layout und <% content_for :title, "Conditional title" %>in den Ansichten.
John
1
Funktioniert perfekt mit Rails 5.2.0!
Stanimir Dimitrov
1
Wenn ich benutze, <h1><%= content_for(:title, "Title for specific page") %></h1>sehe ich keine Ausgabe in meinem DOM (dh ich habe <h1></h1>keinen Inhalt darin). Mein <title>Title for specific page</title>funktioniert jedoch korrekt. Irgendwelche Ideen?
JoshuaESummers
118

Hier ist eine einfache Option, die ich gerne benutze

In Ihrem Layout

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

Und oben in Ihrer Seitenvorlage (erste Zeile)

<% @title="Home" %>

Aufgrund der Art und Weise, wie das Layout und die Seitenvorlagen analysiert werden, wird @ title = "Home" ausgewertet, bevor das Layout gerendert wird.

opsb
quelle
31
Es ist erwähnenswert, dass dies beim Caching der Rails-Ansicht nicht funktioniert. In Rails 3 ist content_for intelligent genug, um mit Caching korrekt zu arbeiten (siehe ausgewählte Antwort).
Opsb
4
sollten keine Variablen im Controller gesetzt werden?
2
@SajjadMerchant im Allgemeinen stimme ich zu, ja Variablen sollten in der Steuerung gesetzt werden. In diesem Fall ist die Vorlage jedoch geeigneter, da Sie ein Attribut angeben, das für das Erscheinungsbild der Seite spezifisch ist. Es ist auch möglich, dass eine Controller-Aktion von zwei verschiedenen Ansichten verwendet wird (nicht, dass dies sehr häufig vorkommt, ich verwende sie, um zu veranschaulichen, wie eng der Titel an eine bestimmte Vorlage gebunden ist).
opsb
50

Best Practice ist die Verwendung von content_for.

Fügen Sie zunächst einige Hilfsmethoden hinzu (z. B. bleiben Sie 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

Dann können Sie in Ihrer Layoutansicht einfach Folgendes verwenden:

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

... und in der Ansicht selbst:

<%= page_heading "Awesome" %>

Auf diese Weise können Sie mischen, wo Sie das h1-Tag für Ihren Titel anbringen, und Ihr Controller bleibt schön und frei von lästigen @ title-Variablen.

Aupajo
quelle
4
Wie setzt man den Wert von @content_for_title?
Jordan Feldstein
@ JordanFeldstein Ich habe keine Ahnung, was er damit gemeint hat @content_for_title. Sollte sein (content_for(:title) + ' &mdash; ' if content_for?(:title)).to_s + 'My Cool Site'. Dann, um es aus Ihrer Sicht einzustellen, einfach<% content_for :title, 'My Page Title' %>
Tobias J
1
@content_for_titleist das, was früher passiert ist, als Sie content_fordiesen Kommentar geschrieben haben. Ich glaube, das ist nicht mehr der Fall, aber ich habe in letzter Zeit nicht nachgesehen. Der Kommentar von Toby J ist für die heutigen Rails korrekt. Ich werde meine ursprüngliche Antwort aktualisieren.
Aupajo
20

Eine Verbesserung von @opsb und eine vollständigere Form von @FouZ :

In application.html.erb:

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

In der Ansicht erb Datei oder deren Controller:

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

Ohne weitere Details zum Anwendungsfall oder zu den Anforderungen, die Sie erfüllen möchten, kann ich mir mehrere Alternativen vorstellen:

1) Wechseln Sie den Titel auf einer Ihrer Layoutseiten und verwenden Sie eine in gespeicherte Hilfsmethode application_helper.rb

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

Dieser Ansatz gibt Ihnen einen eindeutigen Titel für jede Layoutseite.

2) Railscasts schlägt vor, einen Teil zu verwenden, um zu laden, was zwischen den HEAD-Tags angezeigt wird

3) Verwenden Sie Javascript / Ajax-Aufrufe, um das DOM zu bearbeiten, wenn Sie den Titel nach dem Ladeereignis ändern müssen.

Vielleicht möchten Sie den vom titleElement gekennzeichneten Inhalt nicht wirklich ändern . Vielleicht brauchen Sie wirklich eine Art Brotkrume, damit Ihre Benutzer immer wissen, wo sie sich in Bezug auf die Navigationshierarchie Ihrer Site befinden. Obwohl ich mit dem Goldberg-Plugin gut zurechtgekommen bin, gibt es sicher noch andere Möglichkeiten, die gleiche Funktionalität zu nutzen.

Alan
quelle
3

Ich verwende das "nifty_layout" von nifty_generator, das eine Titelvariable enthält, die ich dann auf der Seite aufrufen kann, indem ich:

<% title "Title of page" %>

Ich kann den Benutzer auch <% title "Title of page", false %>dazu bringen, dass der Titel nur im Browsertitel und nicht auf der Seite selbst angezeigt wird.

sent-hil
quelle
2

Sie können es auch in einem before_filter in Ihrem Controller einstellen.

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

Anschließend können Sie in der Methode set_title Bedingungen festlegen , um unterschiedliche Titel für unterschiedliche Aktionen in der Steuerung festzulegen . Es ist schön, alle relevanten Seitentitel in Ihrem Controller sehen zu können.

JasonOng
quelle
2
Es ist (leider) üblich, diese Methode zu verwenden, aber es ist eine schlechte Praxis, Seitentitel in Ihren Controller einzufügen. Ein Seitentitel hat etwas mehr mit der Ansicht zu tun. Welche Relevanz hat ein Seitentitel, wenn Sie beispielsweise eine alternative XML-Ansicht anbieten?
Aupajo
Ja, ich stimme zu, dass es keine gute Idee ist, aber es ist eine Alternative, die in einigen Fällen nützlich sein kann, in denen unterschiedliche Seitentitel unter komplexen Bedingungen geboren werden müssen.
JasonOng
1
Hmm, ich denke immer noch, dass es etwas ist, das als Helfer für die Aussicht gehört. Meine Regel ist es, die XML-Version zu überprüfen und festzustellen, ob diese Variable benötigt wird oder nicht. Wenn nicht, ist es etwas, das eine individuelle Ansicht benötigt. Machen Sie Ihren Controller so leicht wie möglich.
Aupajo
0

Ansatz für die Seitentitelung mit der Methode content_for und einem Teil

1. Teilname: _page_title.html.erb

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

2. Verwendung in application.html.erb innerhalb des Titel-Tags

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

3 . Verwendung in der jeweiligen * .html.erb ohne application.html.erb Stecken Sie diese einfach in eine beliebige .html.erb und geben Sie den Titel der Seite an

    e.g : inside index.html.erb

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

Kurz gesagt, ich kann dies wie folgt aufschreiben

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

Ich mag die Methode von opsb, aber diese Methode funktioniert auch.

<% provide(:title,"ttttttttttttttttttZ") %>
<html>
  <head><title><%= yield(:title) %></title></head>
   <body></body>
</html>
Barlop
quelle
FWIW die Methode hier ist die Methode, die in Hartls Buch Kapitel 3 verwendet wird, nicht dass ich dieses Buch empfehle, da ich es ein bisschen mühsam finde, es durchzuarbeiten, aber trotzdem.
Barlop
-1

Der beste / sauberste Weg, dies zu tun:

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

Ich möchte meine ziemlich einfache Variante hinzufügen.

Definieren Sie im ApplicationController diese Methode:

  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

Danach können Sie get_title über das Titel-Tag Ihres Layouts aufrufen. Sie können einen spezifischeren Titel für Ihre Seite definieren, indem Sie in Ihren Aktionen die Variable @action_title_name definieren.

IDBD
quelle
1
Ich denke, Sie haben das Konzept der Trennung von Bedenken in den letzten sechs Jahren gelernt , aber ich werde es nur für andere veröffentlichen, die möglicherweise verwirrt sind, warum diese Antwort negative Noten erhielt.
Nurettin