Rails 3 - идеальный способ установить заголовок страницы - PullRequest
70 голосов
/ 17 июня 2010

Как правильно установить заголовок страницы в рельсах 3. В настоящее время я делаю следующее:

app / views / layouts / application.html:

<head>
  <title><%= render_title %></title>
  <%= csrf_meta_tag %>

app/helpers/application_helper.rb:

def render_title
  return @title if defined?(@title)
  "Generic Page Title"
end

app / controllers / some_controller.rb:

def show
  @title = "some custom page title"
end

Есть ли другой / лучший способ сделать это выше?

Ответы [ 13 ]

131 голосов
/ 22 июня 2010

вы можете просто помочь:

def title(page_title)
  content_for :title, page_title.to_s
end

использовать его в вашем макете:

<title><%= yield(:title) %></title>

, а затем вызвать его из ваших шаблонов:

<% title "Your custom title" %>

hopeэто помогает;)

52 голосов
/ 31 октября 2011

Нет необходимости создавать какие-либо дополнительные функции / помощники.Вам следует взглянуть на документацию .

в макете приложения

<% if content_for?(:title) %>
  <%= content_for(:title) %>
<% else %>
  <title>Default title</title>
<% end %>

в конкретном макете

<% content_for :title do %>
  <title>Custom title</title>
<% end %>
41 голосов
/ 05 января 2011

Я обнаружил, что решение apeacox не работает для меня (в Rails 3.0.3).

Вместо этого я сделал ...

В application_helper.rb:

def title(page_title, options={})
  content_for(:title, page_title.to_s)
  return content_tag(:h1, page_title, options)
end

В макете:

<title><%= content_for(:title) %></title>

В виде:

<% title "Page Title Only" %>

OR

<%= title "Page Title and Heading Too" %>

Обратите внимание, что это также позволяет нам проверять наличие заголовка и устанавливать заголовок по умолчанию в тех случаях, когда представление не определило его.

В макете мы можем сделать что-то вроде:

<title><%= content_for?(:title) ? content_for(:title) : 'This is a default title' %></title>
3 голосов
/ 04 декабря 2014

Это мой предпочтительный способ сделать это:

application_helper.rb

module ApplicationHelper
  def title(*parts)
    content_for(:title) { (parts << t(:site_name)).join(' - ') } unless parts.empty?
  end
end

просмотров / макеты / application.html.erb

<title>
  <%= content_for?(:title) ? yield(:title) : t(:site_name) %>
</title>

конфиг / локали / en.yml

en:
  site_name: "My Website"

У этого есть приятное преимущество - всегда возвращаться к имени сайта в ваших локалях, которое можно переводить для каждого языка.

Затем на каждой другой странице (например, на странице О программе) вы можете просто указать:

вид / дом / about.html.erb

<% title 'About' %>

В результате заголовок этой страницы будет:

О нас - Мой сайт

Simples:)

2 голосов
/ 01 июля 2010

@ akfalcon - я использую аналогичную стратегию, но без помощника. Я просто устанавливаю @title по умолчанию в контроллере приложения, а затем использую <% = @ title%> в моем макете. Если я хочу переопределить заголовок, я устанавливаю его снова в действии контроллера, как и вы. Никакой магии, но она работает просто отлично. Я делаю то же самое для мета-описания и ключевых слов.

На самом деле я думаю о переносе его в базу данных, чтобы администратор мог изменить заголовки и т. Д. Без необходимости обновления кода Rails. Вы можете создать модель PageTitle с контентом, действием и контроллером. Затем создайте помощник, который найдет PageTitle для контроллера / действия, которое вы в данный момент визуализируете (используя переменные controller_name и action_name). Если совпадений не найдено, верните значение по умолчанию.

@ apeacox - есть ли преимущество установки заголовка в шаблоне? Я думаю, что было бы лучше поместить его в контроллер, так как заголовок напрямую связан с вызываемым действием.

1 голос
/ 12 ноября 2015

Я предпочитаю это:

module ApplicationHelper
  def title(*page_title)
    if Array(page_title).size.zero?
      content_for?(:title) ? content_for(:title) : t(:site_name)
    else
      content_for :title, (Array(page_title) << t(:site_name)).join(' - ')
    end
  end
end

Если title вызывается без аргументов, он возвращает текущее значение заголовка или значение по умолчанию, которое в этом примере будет «Пример».

Он вызывается с аргументами title, для него устанавливается переданное значение.

# layouts/application.html.erb
<title><%= title %></title>

# views/index.html.erb
<% title("Home") %>

# config/locales/en.yml
en:
  site_name: "Example"
0 голосов
/ 01 июня 2017

Уже есть несколько хороших ответов, но я добавлю свой простой подход. Добавьте это в layouts / application.html

- if content_for?(:title)
  -title = "My site | #{content_for(:title)}"
-else
  -title = "My site | #{controller_name.titleize}"

Вы автоматически получаете хорошие имена на всех ваших представлениях, таких как «Мой сайт | Сообщения» - или на том, кем является контроллер.

Конечно, вы можете опционально установить заголовок для вида, добавив:

- content_for(:title, 'About')

и получите заголовок типа «Мой сайт | О программе».

0 голосов
/ 14 апреля 2017

В макете приложения:

# app/views/layouts/application.html.erb

<title><%= (yield :title) || 'General title' %></title>

, затем в каждом представлении, где требуется определенный заголовок:

<% content_for :title, 'Specific title' %>
0 голосов
/ 15 ноября 2016

Существует простой способ манипулировать переменными макета (заголовок, описание и т.

0 голосов
/ 24 мая 2016

Мой ответ более прост:

локали / any_archive.yml

pt-BR:
  delivery_contents:
    title: 'Conteúdos de Entregas'

  groups:
    title: 'Grupos'

И внутри application.html.slim :

title
  = "App Name: #{t("#{controller_name.underscore}.title")}"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...