Rails 3-идеальный способ установить заголовок страницы
как правильно установить заголовок страницы в rails 3. В настоящее время я делаю следующее:
app / views / layouts / application.html:
<head>
<title><%= render_title %></title>
<%= csrf_meta_tag %>
приложения/помощники/application_helper.РБ:
def render_title
return @title if defined?(@title)
"Generic Page Title"
end
приложение/контроллеры/some_controller.РБ:
def show
@title = "some custom page title"
end
есть ли другой/лучший способ сделать выше?
13 ответов:
вы могли бы простой помощник:
def title(page_title) content_for :title, page_title.to_s endиспользуйте его в своем макете:
<title><%= yield(:title) %></title>затем вызовите его из ваших шаблонов:
<% title "Your custom title" %>надеюсь, что это помогает ;)
нет необходимости создавать какие-либо дополнительные функции/помощник. Вы должны посмотреть на документация.
в макете приложения
<% if content_for?(:title) %> <%= content_for(:title) %> <% else %> <title>Default title</title> <% end %>в формате
<% content_for :title do %> <title>Custom title</title> <% end %>
я обнаружил, что решение 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>
Это мой предпочтительный способ сделать это:
application_helper.РБ
module ApplicationHelper def title(*parts) content_for(:title) { (parts << t(:site_name)).join(' - ') } unless parts.empty? end endпросмотров/макеты/приложения.формат html.Эрб
<title> <%= content_for?(:title) ? yield(:title) : t(:site_name) %> </title>config / locales / en.в формате YML
en: site_name: "My Website"это имеет хорошее преимущество, чтобы всегда возвращаться к имени сайта в ваших локалях, которые могут быть переведены на основе каждого языка.
затем на каждой другой странице (например. на странице О компании) вы можете просто ставлю:
views / home / about.формат html.Эрб
<% title 'About' %>полученное название для этой страницы будет:
О - Мой Сайт
Simples:)
@akfalcon-я использую аналогичную стратегию, но без помощника.. Я просто устанавливаю @title По умолчанию в контроллере приложения, а затем использую, В моем макете. Если я хочу переопределить заголовок, я снова устанавливаю его в действии контроллера, как и вы. Никакой магии, но она работает просто отлично. Я делаю то же самое для мета-описания и ключевых слов.
Я на самом деле думаю о переезде его в базу данных, чтобы админ мог менять названия и т. д. без необходимости обновления Код рельсов. Вы можете создать модель PageTitle с содержимым, действием и контроллером. Затем создайте помощник, который находит PageTitle для контроллера / действия, которое вы в настоящее время визуализируете (используя переменные controller_name и action_name). Если совпадение не найдено, верните значение по умолчанию.
@apeacox - есть ли преимущество установки заголовка в шаблоне? Я бы подумал, что было бы лучше разместить его в контроллере, поскольку название напрямую связано с действием называемый.
Я предпочитаю этот:
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 или значение по умолчанию, которое в данном примере будет "Example".это
titleвызывается с аргументами, он устанавливает его в переданное значение.# layouts/application.html.erb <title><%= title %></title> # views/index.html.erb <% title("Home") %> # config/locales/en.yml en: site_name: "Example"
вы также можете проверить это railscast. Я думаю, это будет очень полезно и даст вам начальную.
примечание: в случае, если вы хотите больше динамических страниц с pjax
у меня несколько более сложное решение. Я хочу управлять всеми моими названиями в моих файлах локали. Я также хочу включить значимые заголовки для показа и редактирования страниц, чтобы имя ресурса было включено в заголовок страницы. Наконец, я хочу включить имя приложения в каждый заголовок страницы, например
Editing user Gustav - MyApp.для этого я создаю помощника в
application_helper.rbкоторый делает большую часть тяжелого подъема. Это пытается получить имя для данного действия из файла локали, a имя для назначенного ресурса, если он есть, и объединяет их с именем приложения.# 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
Я думал, что это будет хорошо:
<title> <% if @title %> <%= @title %> <% else %> Your title <% end %> </title>и дать значение @title В контроллере, или название будет
Your title
мой ответ более прост:
locales / any_archive.в формате YML:
pt-BR: delivery_contents: title: 'Conteúdos de Entregas' groups: title: 'Grupos'и внутри приложение.формат html.Слим:
title = "App Name: #{t("#{controller_name.underscore}.title")}"
есть простой способ манипулировать переменными макета (название, описание и т. д.):
# 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значение для их названия
в макет приложения:
# app/views/layouts/application.html.erb <title><%= (yield :title) || 'General title' %></title>затем в каждом представлении, где вы хотите конкретное название:
<% content_for :title, 'Specific title' %>
уже есть несколько хороших ответов, но я добавлю свой простой подход. Добавьте это в макеты / приложения.HTML-код
- if content_for?(:title) -title = "My site | #{content_for(:title)}" -else -title = "My site | #{controller_name.titleize}"вы автоматически получаете хорошие имена на всех ваших представлениях, таких как" мой сайт | сообщения " - или что бы ни случилось с контроллером.
конечно, можно дополнительно установите заголовок представления, добавив:
- content_for(:title, 'About')и получить название, как "мой сайт / о компании".
Comments