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


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

495   13  

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

    Ничего не найдено.