Rails: Як змінити назву сторінки?


160

Який найкращий спосіб створити спеціальний заголовок для сторінок у додатку Rails без використання додатка?

Відповіді:


244

Як ви думаєте, зробіть щось подібне:

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

У файлі макета йде наступне:

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

Також можливо інкапсулювати content_forта yield(:title)твердження в допоміжні методи (як уже пропонували інші). Однак у простих випадках, таких як цей, я люблю вводити необхідний код безпосередньо у конкретні представлення без спеціальних помічників.


24
Цю відповідь я з’єднав із нижченаведеною, щоб створити "заголовок за замовчуванням" для кожної сторінки: <title><%= (yield(:title) + " - " unless yield(:title).blank?).to_s + "This is always shown" %></title>у макеті та <% content_for :title, "Conditional title" %>в представленнях.
Джон

1
Відмінно працює з Rails 5.2.0!
Станімір Димитров

1
Під час використання <h1><%= content_for(:title, "Title for specific page") %></h1>я не бачу нічого виводу в свою DOM (тобто у мене <h1></h1>немає вмісту в ньому). Однак моя <title>Title for specific page</title>працює правильно. Будь-які ідеї?
JoshuaESummers

118

Ось простий варіант, який я люблю використовувати

У вашому макеті

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

І вгорі шаблону сторінки (перший рядок)

<% @title="Home" %>

Через те, як проаналізовано макет та шаблони сторінок, перед тим, як викладено макет, буде оцінено @ title = "Головна".


32
Варто зазначити, що це не буде працювати з кешуванням перегляду рейок. На рейках 3 content_for досить розумний, щоб правильно працювати з кешуванням (див. Обрану відповідь).
opsb

4
чи не слід встановлювати змінні всередині контролера?

2
@SajjadMerchant, як правило, я згоден, так, змінні повинні бути встановлені в контролері. У цьому випадку шаблон вважається більш підходящим, хоча ви вказуєте атрибут, специфічний для зовнішнього вигляду сторінки. Можливо також, що дія контролера використовується двома різними уявленнями (не те, що трапляється дуже часто, я використовую це, щоб проілюструвати, наскільки щільно пов'язаний заголовок до певного шаблону).
opsb

50

Найкраща практика - використовувати content_for.

Спочатку додайте пару допоміжних методів (наприклад, палиця в 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

Тоді у вашому перегляді макета ви можете просто використовувати:

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

... і в самому погляді:

<%= page_heading "Awesome" %>

Цей спосіб має перевагу в тому, що ви можете переміщати місця, де ви вставляєте тег h1 для свого заголовка, і зберігає ваш контролер приємним і вільним від прискіпливих змінних @title.


4
Як можна встановити значення @content_for_title?
Йордан Фельдштейн

@JordanFeldstein Я поняття не маю, що він мав на увазі @content_for_title. Повинно бути (content_for(:title) + ' &mdash; ' if content_for?(:title)).to_s + 'My Cool Site'. Потім, щоб встановити це з вашого погляду, просто<% content_for :title, 'My Page Title' %>
Tobias J

1
@content_for_titleце те, що колись було, коли ви content_forписали цей коментар. Я вважаю, що це вже не так, але останнім часом я не дивився. Коментар Toby J правильний для сьогоднішніх Rails. Я оновлю свою оригінальну відповідь.
Aupajo

20

Поліпшення @opsb та більш повна форма @FouZ :

В application.html.erb:

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

У файлі перегляду erb або його контролері:

<% @title = "Unique Page Title" %>


6

Без додаткових подробиць щодо випадку використання або вимог, які ви намагаєтесь задовольнити, я можу придумати декілька альтернатив:

1) Перемістіть заголовок на одній із сторінок макета та скористайтеся помічником, який зберігається application_helper.rb

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

Цей підхід дасть вам унікальну назву для кожної сторінки макета.

2) Railscasts пропонує використовувати часткове для завантаження того, що відображається між тегами HEAD

3) Використовуйте виклики javascript / ajax для маніпуляції з DOM, якщо вам потрібно змінити заголовок після події завантаження.

Можливо, ви не дуже хочете змінювати вміст, позначений titleелементом. Можливо, вам справді потрібна певна сухарі, щоб ваші користувачі завжди знали, де вони знаходяться щодо ієрархії навігації вашого сайту. Хоча я добре справився з тим, як плагін Goldberg, я впевнений, що існують інші способи зняти таку ж функціональність.


3

Я використовую nifty_generator "nifty_layout", який забезпечує змінну заголовка, яку я можу викликати потім на сторінці, використовуючи:

<% title "Title of page" %>

Я також можу, <% title "Title of page", false %>щоб заголовок відображався в заголовку браузера, а не на самій сторінці.


2

Ви також можете встановити його на попередньому фільтрі у своєму контролері.

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

Потім можна встановити умови методу set_title, щоб встановити різні титри для різних дій у контролері. Приємно бачити всі відповідні заголовки сторінки у вашому контролері.


2
На жаль, звичайно використовувати цей спосіб, але погано застосовувати заголовки сторінок у контролері. Заголовок сторінки - щось більше, пов’язане з переглядом. Якщо ви, наприклад, запропонували альтернативний перегляд XML, яке значення має заголовок сторінки?
Aupajo

Так, я погоджуюся, що це не дуже гарна ідея, але, однак, це альтернатива, яка може бути корисною в деяких випадках, коли різні заголовки сторінок потребують отримання складних умов?
JasonOng

1
Хм, я все ще думаю, що це щось, що належить як помічник для погляду. Моє правило - подивитися на версію XML і побачити, чи потрібна вона цій змінній чи ні. Якщо ні, то це щось необхідне індивідуальному погляду. Зробіть ваш контролер максимально світлим.
Aupajo


0

підхід до титрування сторінок за допомогою методу content_for та часткового

1. часткова назва: _page_title.html.erb

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

2. Використання в application.html.erb всередині тегу заголовка

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

3. Використання у відповідному * .html.erb, за винятком application.html.erb Просто вставте це у будь-який .html.erb та вкажіть назву сторінки

    e.g : inside index.html.erb

    <%=render '_page_title', title: 'title_of_page'%>


0

Мені подобається метод opsb, але і цей метод працює.

<% provide(:title,"ttttttttttttttttttZ") %>
<html>
  <head><title><%= yield(:title) %></title></head>
   <body></body>
</html>

Метод FWIW тут - це метод, що використовується в розділі 3 книги Хартла, не те, що я рекомендую цю книгу, оскільки я вважаю, що це неприємності, але все одно.
барлоп

-1

Найкращий / чистий спосіб зробити це:

<title><%= @page_title or 'Page Title' %></title>

-9

Я хотів би додати свій досить простий варіант.

У ApplicationController визначте цей метод:

  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

Після цього ви можете зателефонувати get_title із заголовкового тегу вашого макета. Ви можете визначити більш конкретну назву для своєї сторінки, визначивши змінну @action_title_name у своїх діях.


1
Я здогадуюсь, що ви засвоїли концепцію відокремлення проблем протягом останніх шести років, але я просто викладу її там, хто може заплутатися в тому, чому ця відповідь отримала негативні оцінки.
Нуреттін
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.