Rails: Jak zmienić tytuł strony?

160

Jaki jest najlepszy sposób tworzenia niestandardowego tytułu dla stron w aplikacji Rails bez użycia wtyczki?

wusher
źródło

Odpowiedzi:

244

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

Christoph Schiessl
źródło
24
Połączyłem tę odpowiedź z poniższą, aby utworzyć „domyślny tytuł” ​​dla każdej strony: <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.
John
1
Doskonale współpracuje z Railsami 5.2.0!
Stanimir Dimitrov
1
Kiedy używam <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?
JoshuaESummers
118

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.

opsb
źródło
32
Warto zauważyć, że to nie zadziała z buforowaniem widoku railsów. W railsach 3 content_for jest wystarczająco inteligentny, aby poprawnie pracować z buforowaniem (patrz wybrana odpowiedź).
opsb
4
czy nie powinno się ustawiać zmiennych wewnątrz kontrolera?
2
@SajjadMerchant generalnie się zgadzam, tak zmienne należy ustawić w kontrolerze. W tym przypadku szablon wydaje się jednak bardziej odpowiedni, ponieważ określasz atrybut specyficzny dla wyglądu strony. Możliwe jest również, że akcja kontrolera może być używana przez dwa różne widoki (nie, że zdarza się to bardzo często, używam jej, aby zilustrować, jak mocno tytuł jest powiązany z określonym szablonem).
opsb
50

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.

Aupajo
źródło
4
Jak ustawić wartość @content_for_title?
Jordan Feldstein,
@JordanFeldstein Nie mam pojęcia, co miał na myśli @content_for_title. Powinien być (content_for(:title) + ' &mdash; ' if content_for?(:title)).to_s + 'My Cool Site'. Następnie, aby ustawić to z widoku, po prostu<% content_for :title, 'My Page Title' %>
Tobias J,
1
@content_for_titlejest 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ź.
Aupajo
20

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" %>
boulder_ruby
źródło
6

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

Alan
źródło
3

Używam „nifty_layout” nifty_generator, który zawiera zmienną tytułu, którą mogę wywołać na stronie za pomocą:

<% title "Title of page" %>

Mogę również, <% title "Title of page", false %>aby tytuł był wyświetlany tylko w tytule przeglądarki, a nie na samej stronie.

sent-hil
źródło
2

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.

JasonOng
źródło
2
Stosowanie tego sposobu (niestety) jest powszechną praktyką, ale umieszczanie tytułów stron w kontrolerze jest złą praktyką. Tytuł strony jest bardziej związany z widokiem. Gdybyś miał na przykład zaoferować alternatywny widok XML, jakie znaczenie ma tytuł strony?
Aupajo
Tak, zgadzam się, że to niezbyt dobry pomysł, ale jednak jest to alternatywa, która może być przydatna w niektórych przypadkach, gdy różne tytuły stron muszą powstać ze złożonych warunków?
JasonOng
1
Hmm, nadal uważam, że to coś, co należy jako pomocnik dla widoku. Moja reguła jest taka, aby spojrzeć na wersję XML i sprawdzić, czy potrzebuje tej zmiennej, czy nie. Jeśli nie, jest to coś, czego potrzebuje indywidualny widok. Spraw, aby Twój kontroler był jak najlżejszy.
Aupajo,
0

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'%>
Kofi Asare
źródło
0

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 %>
Mukesh Kumar Gupta
źródło
0

Podoba mi się metoda Opsb, ale ta metoda też działa.

<% provide(:title,"ttttttttttttttttttZ") %>
<html>
  <head><title><%= yield(:title) %></title></head>
   <body></body>
</html>
barlop
źródło
FWIW tutaj metoda jest metodą użytą w 3 rozdziale książki Hartla, nie żebym polecał tę książkę, ponieważ uważam to za trochę kłopotliwe, ale w każdym razie.
barlop,
-1

Najlepszy / czysty sposób na zrobienie tego:

<title><%= @page_title or 'Page Title' %></title>
FouZ
źródło
-9

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.

IDBD
źródło
1
Wydaje mi się, że w ciągu ostatnich sześciu lat nauczyłeś się pojęcia oddzielania obaw , ale po prostu przedstawię to innym, którzy mogą być zdezorientowani, dlaczego ta odpowiedź ma negatywne oceny.
nurettin