Подтвердить что ты не робот

Rails 3 - Идеальный способ установки заголовков страниц

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

приложение/просмотров/макеты/application.html:

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

Приложение/хелперы/application_helper.rb:

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

приложение/контроллеры/some_controller.rb:

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

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

4b9b3361

Ответ 1

вы могли бы сделать простой помощник:

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

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

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

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

<% title "Your custom title" %>

надеюсь, что это поможет;)

Ответ 2

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

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

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

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

<% content_for :title do %>
  <title>Custom title</title>
<% end %>

Ответ 3

Я обнаружил, что решение 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" %>

ИЛИ

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

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

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

<title><%= content_for?(:title) ? content_for(:title) : 'This is a default title' %></title>

Ответ 4

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

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>

<сильные > Config/локалей/en.yml

en:
  site_name: "My Website"

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

Затем на любой другой странице (например, на странице About) вы можете просто поставить:

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

<% title 'About' %>

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

О - Мой сайт

Симпсоны:)

Ответ 5

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

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

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

Ответ 6

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

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"

Ответ 7

Вы также можете проверить это railscast. Я думаю, что это будет очень полезно и даст вам базовый старт.

ПРИМЕЧАНИЕ. Если вам нужны более динамические страницы с pjax

Ответ 8

У меня несколько более сложное решение. Я хочу управлять всеми моими названиями в своих файлах локали. Я также хочу включать значимые заголовки для показа и редактирования страниц, чтобы имя ресурса включалось в заголовок страницы. Наконец, я хочу включить имя приложения в каждое название страницы, например. Editing user Gustav - MyApp.

Для этого я создаю помощник в application_helper.rb, который делает большую часть тяжелого подъема. Это пытается получить имя для данного действия из файла локали, имя назначенного ресурса, если оно есть, и объединяет их с именем приложения.

# Attempt to build the best possible page title.
# If there is an action specific key, use that (e.g. users.index).
# If there is a name for the object, use that (in show and edit views).
# Worst case, just use the app name
def page_title
  app_name = t :app_name
  action = t("titles.#{controller_name}.#{action_name}", default: '')
  action += " #{object_name}" if object_name.present?
  action += " - " if action.present?
  "#{action} #{app_name}"
end

# attempt to get a usable name from the assigned resource
# will only work on pages with singular resources (show, edit etc)
def object_name
  assigns[controller_name.singularize].name rescue nil
end

Вам нужно будет добавить тексты конкретных действий в файлы локали в следующей форме:

# en.yml 
titles:
  users:
    index: 'Users'
    edit: 'Editing'

И если вы хотите использовать значимые имена ресурсов в своих особых представлениях, вам может потребоваться добавить несколько прокси-методов, например.

# User.rb
def name
  username
end

Ответ 9

Я думал, это будет хорошо:

<title>
    <% if @title %>
      <%= @title %>
    <% else %>
      Your title
    <% end %>
</title>

И укажите значение @title в вашем контроллере, или заголовок будет Your title

Ответ 10

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

локали /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")}"

Ответ 11

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

# app/views/application.html.erb
<title>
  <%= content_for :title || 'App default title' %>
</title>

# app/views/posts/index.html.erb
<%= content_for :title, 'List of posts' %>

И другие страницы будут иметь App default title значение для своих названий

Ответ 12

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

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

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

то в каждом представлении, где вы хотите получить конкретное название:

<% content_for :title, 'Specific title' %>

Ответ 13

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

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

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

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

- content_for(:title, 'About')

и получите название "Мой сайт | О".