Rails: jak zmienić tytuł strony?

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

Author: Flip, 2008-10-09

14 answers

W swoich poglądach zrób coś takiego:

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

W pliku layoutu znajduje się:

<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 sugerowały już inne metody). Jednak w prostych przypadkach, takich jak ten, Lubię umieszczać niezbędny kod bezpośrednio w konkretnych widokach bez niestandardowych helperów.

 225
Author: Christoph Schiessl,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-12-08 12:38:12

Oto prosta opcja, którą lubię używać

W twoim układzie

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

I na górze szablonu strony (pierwsza linia)

<% @title="Home" %>

Ze względu na sposób parsowania szablonów układu i strony, @title="Home" jest obliczany przed renderowaniem układu.

 113
Author: opsb,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-09-26 13:56:59

Najlepszą praktyką jest użycie content_for.

Najpierw dodaj kilka metod pomocniczych (np. przyklej w 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>

...i w samym widoku:

<%= page_heading "Awesome" %>

Ten sposób ma tę zaletę, że pozwala Ci przetasować miejsce, w którym przyklejasz znacznik h1 dla tytułu, i utrzymuje kontroler ładny i wolny od brzydkich zmiennych @title.

 48
Author: Aupajo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-10-31 02:11:54

Ulepszenie na @ opsb i pełniejsza forma @FouZ 's:

W application.html.erb:

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

W widoku pliku erb lub jego kontrolera:

<% @title = "Unique Page Title" %>
 19
Author: boulder_ruby,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-02-21 10:32:29

Zajrzyj do content_for: http://railscasts.com/episodes/8

 13
Author: Avdi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-09 05:01:11

Bez dalszych szczegółów na temat przypadków użycia lub wymagań, które próbujesz spełnić, mogę wymyślić kilka alternatyw:

1) Zmień tytuł na jednej ze stron układu graficznego i skorzystaj z metody pomocniczej przechowywanej w application_helper.rb

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

To podejście daje unikalny tytuł dla każdej strony układu.

2) Railscasts sugeruje użycie częściowego obciążenia, co pojawia się między znacznikami głowicy

3) Użyj javascript/ajax wywołania manipulować DOM jeśli chcesz zmienić tytuł po zdarzeniu load.

Może tak naprawdę nie chcesz zmieniać zawartości oznaczonej przez element title. Być może naprawdę potrzebujesz czegoś takiego, aby Twoi użytkownicy zawsze wiedzieli, gdzie są w odniesieniu do hierarchii nawigacji w Twojej witrynie. Chociaż zrobiłem dobrze z wtyczką goldberg, jestem pewien, że istnieją inne sposoby na ściągnięcie tej samej funkcjonalności.

 6
Author: Alan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-09 05:06:09

Używam nifty_generator ' s "nifty_layout", który zapewnia zmienną title, którą mogę wywołać na stronie używając:

<% title "Title of page" %>

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

 3
Author: sent-hil,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-01-04 13:19:13

Możesz również ustawić go w 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>

Możesz następnie ustawić warunki w metodzie set_title , aby ustawić różne tytuły dla różnych akcji w kontrolerze. Miło jest widzieć wszystkie odpowiednie tytuły stron w kontrolerze.

 2
Author: JasonOng,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-09 07:12:16

Najlepszy / czysty sposób na to:

<title><%= @page_title or 'Page Title' %></title>
 0
Author: FouZ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-02-06 03:41:34
 0
Author: Henrik N,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-04-16 13:08:11

Podejście do tytułowania strony 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 . Zastosowanie w aplikacji.html.erb inside title tag

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

3 . Zastosowanie w poszczególnych *.html.erb z wyłączeniem aplikacji.html.erb Włóż to do każdego .html.erb i tytuł strony

    e.g : inside index.html.erb

    <%=render '_page_title', title: 'title_of_page'%>
 0
Author: Kofi Asare,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-02 09:21:33

W skrócie, mogę to zapisać w następujący sposób

<%content_for :page_title do %><%= t :page_title, "Name of Your Page" %> <% end %>
 0
Author: Mukesh Kumar Gupta,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-25 05:30:14

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

<% provide(:title,"ttttttttttttttttttZ") %>
<html>
  <head><title><%= yield(:title) %></title></head>
   <body></body>
</html>
 0
Author: barlop,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-14 00:27:04

Chciałbym dodać mój dość 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 ze znacznika tytułu układu. Możesz zdefiniować bardziej szczegółowy tytuł dla swojej strony, definiując zmienną @ action_title_name w swoich akcjach.

 -9
Author: IDBD,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-09 18:33:29