Antworten:
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_for
und 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.
<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?
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.
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.
@content_for_title
?
@content_for_title
. Sollte sein (content_for(:title) + ' — ' if content_for?(:title)).to_s + 'My Cool Site'
. Dann, um es aus Ihrer Sicht einzustellen, einfach<% content_for :title, 'My Page Title' %>
@content_for_title
ist das, was früher passiert ist, als Sie content_for
diesen 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.
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" %>
Schauen Sie in content_for
: http://railscasts.com/episodes/8
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 title
Element 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.
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.
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.
ich benutze dieses PluginDiese Rails-Helfer habe ich geschrieben: http://web.archive.org/web/20130117090719/http://henrik.nyh.se/2007/11/my-rails-title-helpers/
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'%>
Kurz gesagt, ich kann dies wie folgt aufschreiben
<%content_for :page_title do %><%= t :page_title, "Name of Your Page" %> <% end %>
Ich mag die Methode von opsb, aber diese Methode funktioniert auch.
<% provide(:title,"ttttttttttttttttttZ") %>
<html>
<head><title><%= yield(:title) %></title></head>
<body></body>
</html>
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.
<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.