Ответы:
По вашему мнению сделайте что-то вроде этого:
<% 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)
утверждение в вспомогательных методах (как и другие уже предложили). Тем не менее, в простых случаях, таких как этот, мне нравится помещать необходимый код непосредственно в конкретные представления без пользовательских помощников.
<h1><%= content_for(:title, "Title for specific page") %></h1>
я не вижу ничего, что выводится в мой DOM (т.е. у меня <h1></h1>
нет содержимого). Однако мой <title>Title for specific page</title>
работает правильно. Любые идеи?
Вот простой вариант, который мне нравится использовать
В вашем макете
<head>
<title><%= @title %></title>
</head>
И в верхней части страницы шаблона (первая строка)
<% @title="Home" %>
Из-за способа анализа макета и шаблонов страницы @ title = "Home" оценивается до отображения макета.
Лучшая практика - использовать 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.
@content_for_title
?
@content_for_title
. Должно быть (content_for(:title) + ' — ' if content_for?(:title)).to_s + 'My Cool Site'
. Затем, чтобы установить его с вашей точки зрения, просто<% content_for :title, 'My Page Title' %>
@content_for_title
это то, что случалось, когда вы использовали content_for
, во время написания этого комментария. Я считаю, что это больше не так, но я не смотрел в последнее время. Комментарий Тоби Дж является правильным для сегодняшних Rails. Я обновлю свой оригинальный ответ.
Улучшение @opsb и более полная форма @FouZ :
В application.html.erb
:
<title><%= @title || "Default Page Title" %></title>
В файле представления erb или его контроллере:
<% @title = "Unique Page Title" %>
Посмотрите на content_for
: http://railscasts.com/episodes/8
Без дополнительной информации о сценарии использования или требованиях, которые вы пытаетесь удовлетворить, я могу придумать несколько альтернатив:
1) Переключите заголовок на одной из ваших страниц макета и используйте вспомогательный метод, хранящийся в application_helper.rb
<title><%= custom_title %></title>
Этот подход даст вам уникальный заголовок для каждой страницы макета.
2) Railscasts предлагает использовать частичное для загрузки того, что отображается между тегами HEAD
3) Используйте вызовы javascript / ajax для манипулирования DOM, если вам нужно изменить заголовок после события загрузки.
Возможно, вы на самом деле не хотите менять содержимое, помеченное title
элементом. Возможно, вам действительно нужны какие-то хлебные крошки, чтобы ваши пользователи всегда знали, где они находятся относительно иерархии навигации вашего сайта. Хотя я хорошо справился с плагином goldberg, я уверен, что есть и другие способы реализовать ту же функциональность.
Я использую nifty_generator "nifty_layout", который предоставляет переменную title, которую я могу затем вызвать на странице, используя:
<% title "Title of page" %>
Я также могу позволить пользователю <% title "Title of page", false %>
отображать заголовок только в заголовке браузера, а не на самой странице.
Вы также можете установить его в 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, чтобы установить разные заголовки для разных действий в контроллере. Приятно иметь возможность видеть все соответствующие заголовки страниц в вашем контроллере.
я использую этот плагинэти помощники Rails я написал: http://web.archive.org/web/20130117090719/http://henrik.nyh.se/2007/11/my-rails-title-helpers/
подход для заголовка страницы с использованием метода content_for и частичного
1 частичное имя: _page_title.html.erb
<%content_for :page_title do %>
<%=title%>
<%end%>
2 Использование в application.html.erb внутри тега title
<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'%>
Короче говоря, я могу записать это следующим образом
<%content_for :page_title do %><%= t :page_title, "Name of Your Page" %> <% end %>
Мне нравится метод opsb, но этот метод тоже работает.
<% provide(:title,"ttttttttttttttttttZ") %>
<html>
<head><title><%= yield(:title) %></title></head>
<body></body>
</html>
Я хотел бы добавить свой довольно простой вариант.
В 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 в своих действиях.
<title><%= (yield(:title) + " - " unless yield(:title).blank?).to_s + "This is always shown" %></title>
в макете и<% content_for :title, "Conditional title" %>
в представлениях.