Odpowiedzi:
W swoich widokach zrób coś takiego:
<% content_for :title, "Title for specific page" %>
<!-- or -->
<h1><%= content_for(:title, "Title for specific page") %></h1>
W pliku układu znajdują się następujące informacje:
<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>
Możliwe jest również hermetyzowanie instrukcji content_for
i yield(:title)
w metodach pomocniczych (jak już sugerowali inni). Jednak w prostych przypadkach, takich jak ten, lubię umieszczać niezbędny kod bezpośrednio w określonych widokach bez niestandardowych pomocników.
<h1><%= content_for(:title, "Title for specific page") %></h1>
, nie widzę żadnych danych wyjściowych do mojego DOM (tj. Nie mam <h1></h1>
w nim żadnej treści). Jednak mój <title>Title for specific page</title>
działa poprawnie. Jakieś pomysły?
Oto prosta opcja, której lubię używać
W twoim układzie
<head>
<title><%= @title %></title>
</head>
U góry szablonu strony (pierwsza linia)
<% @title="Home" %>
Ze względu na sposób analizowania układu i szablonów stron @ title = "Strona główna" jest oceniana przed renderowaniem układu.
Najlepszą praktyką jest użycie content_for.
Najpierw dodaj kilka metod pomocniczych (np. 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
Następnie w widoku układu możesz po prostu użyć:
<title><%= page_title %></title>
... iw samym widoku:
<%= page_heading "Awesome" %>
Ten sposób ma tę zaletę, że pozwala tasować miejsce, w którym wstawiasz tag h1 dla swojego tytułu, i utrzymuje kontroler w ładnym i wolnym od brzydkich zmiennych @title.
@content_for_title
?
@content_for_title
. Powinien być (content_for(:title) + ' — ' if content_for?(:title)).to_s + 'My Cool Site'
. Następnie, aby ustawić to z widoku, po prostu<% content_for :title, 'My Page Title' %>
@content_for_title
jest to, co działo się, gdy używałeś content_for
, w czasie pisania tego komentarza. Wydaje mi się, że już tak nie jest, ale ostatnio nie szukałem. Komentarz Toby'ego J jest poprawny dla dzisiejszych Railsów. Zaktualizuję moją pierwotną odpowiedź.
Ulepszenie @opsb i bardziej kompletna forma @FouZ :
W application.html.erb
:
<title><%= @title || "Default Page Title" %></title>
W widoku pliku erb lub jego kontrolera:
<% @title = "Unique Page Title" %>
Zajrzyj na content_for
: http://railscasts.com/episodes/8
Bez dalszych szczegółów na temat przypadku użycia lub wymagań, które próbujesz spełnić, mogę wymyślić kilka alternatyw:
1) Zmień tytuł na jednej ze swoich stron układu i użyj metody pomocniczej przechowywanej w application_helper.rb
<title><%= custom_title %></title>
Takie podejście zapewni unikalny tytuł dla każdej strony układu.
2) Railscasts sugeruje użycie częściowej do załadowania tego, co pojawia się między tagami HEAD
3) Użyj wywołań javascript / ajax, aby manipulować DOM, jeśli chcesz zmienić tytuł po zdarzeniu load.
Może tak naprawdę nie chcesz zmieniać treści oznaczonej przez title
element. Być może naprawdę potrzebujesz jakiegoś menu nawigacyjnego, aby użytkownicy zawsze wiedzieli, gdzie się znajdują w odniesieniu do hierarchii nawigacji w Twojej witrynie. Chociaż dobrze poradziłem sobie z wtyczką goldberga, jestem pewien, że istnieją inne sposoby uzyskania tej samej funkcjonalności.
Możesz również ustawić go w filtrze before_filter w kontrolerze.
# 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>
Następnie możesz ustawić warunki w metodzie set_title , aby ustawić różne tytuły dla różnych akcji w kontrolerze. Fajnie jest widzieć wszystkie odpowiednie tytuły stron w kontrolerze.
używam ta wtyczkatych pomocników Rails, które napisałem: http://web.archive.org/web/20130117090719/http://henrik.nyh.se/2007/11/my-rails-title-helpers/
podejście do tytułów stron przy użyciu metody content_for i częściowej
1. nazwa częściowa: _page_title.html.erb
<%content_for :page_title do %>
<%=title%>
<%end%>
2. Wykorzystanie w application.html.erb w tagu tytułowym
<title><%=yield :page_title %></title>
3. Użycie w odpowiednim * .html.erb z wyłączeniem application.html.erb Po prostu umieść to w dowolnym .html.erb i podaj tytuł strony
e.g : inside index.html.erb
<%=render '_page_title', title: 'title_of_page'%>
Krótko mówiąc, mogę to zapisać w następujący sposób
<%content_for :page_title do %><%= t :page_title, "Name of Your Page" %> <% end %>
Podoba mi się metoda Opsb, ale ta metoda też działa.
<% provide(:title,"ttttttttttttttttttZ") %>
<html>
<head><title><%= yield(:title) %></title></head>
<body></body>
</html>
Chciałbym dodać mój całkiem prosty wariant.
W ApplicationController zdefiniuj tę metodę:
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
Następnie możesz wywołać get_title z tagu tytułu swojego układu. Możesz zdefiniować bardziej szczegółowy tytuł swojej strony, definiując zmienną @action_title_name w swoich działaniach.
<title><%= (yield(:title) + " - " unless yield(:title).blank?).to_s + "This is always shown" %></title>
w układzie i<% content_for :title, "Conditional title" %>
w widokach.