Rails: как изменить заголовок страницы? - PullRequest
153 голосов
/ 09 октября 2008

Каков наилучший способ создания пользовательского заголовка для страниц в приложении Rails без использования плагина?

Ответы [ 14 ]

231 голосов
/ 09 октября 2008

По вашему мнению сделайте что-то вроде этого:

<% 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) во вспомогательные методы (как уже предлагали другие). Однако в таких простых случаях, как этот, мне нравится помещать необходимый код непосредственно в конкретные представления без пользовательских помощников.

118 голосов
/ 26 сентября 2009

Вот простой вариант, который мне нравится использовать

В вашем макете

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

А вверху страницы шаблон (первая строка)

<% @title="Home" %>

Из-за способа синтаксического анализа макета и шаблонов страницы @ title = "Home" оценивается до отображения макета.

49 голосов
/ 09 октября 2008

Рекомендуется использовать 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.

20 голосов
/ 19 мая 2013

Улучшение @ opsb и более полная форма @ FouZ s:

В application.html.erb:

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

В файле представления erb или его контроллере:

<% @title = "Unique Page Title" %>
13 голосов
/ 09 октября 2008

Просмотр content_for: http://railscasts.com/episodes/8

6 голосов
/ 09 октября 2008

Без дополнительной информации о сценарии использования или требованиях, которые вы пытаетесь удовлетворить, я могу придумать несколько альтернатив:

1) Переключите заголовок на одной из страниц макета и используйте вспомогательный метод, сохраненный в application_helper.rb

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

Этот подход даст вам уникальный заголовок для каждой страницы макета.

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

3) Используйте вызовы javascript / ajax для манипулирования DOM, если вам нужно изменить заголовок после события загрузки.

Возможно, вы действительно не хотите изменять содержимое, помеченное элементом title. Возможно, вам действительно нужны какие-то хлебные крошки, чтобы ваши пользователи всегда знали, где они находятся относительно иерархии навигации вашего сайта. Несмотря на то, что я хорошо справился с плагином goldberg, я уверен, что есть и другие способы реализовать ту же функциональность.

3 голосов
/ 26 сентября 2010

Я использую nifty_generator "nifty_layout", который предоставляет переменную заголовка, которую я могу затем вызвать на странице, используя:

<% title "Title of page" %>

Я также могу использовать <% title "Title of page", false %>, чтобы заголовок отображался только в заголовке браузера, а не на самой странице.

2 голосов
/ 09 октября 2008

Вы также можете установить его в before_filter в вашем контроллере.

# 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 , чтобы установить разные заголовки для разных действий в контроллере. Приятно иметь возможность видеть все соответствующие заголовки страниц в вашем контроллере.

0 голосов
/ 14 января 2018

Мне нравится метод opsb, но этот метод тоже работает.

<% provide(:title,"ttttttttttttttttttZ") %>
<html>
  <head><title><%= yield(:title) %></title></head>
   <body></body>
</html>
0 голосов
/ 25 января 2017

Короче, я могу записать это следующим образом

<%content_for :page_title do %><%= t :page_title, "Name of Your Page" %> <% end %>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...