# coding: utf-8

4.1.1 Тitle helper

Когда мы в последний раз видели наше новое приложение, мы только что обновили наши, в основном статические, страницы использовав Rails шаблон для устранения дублирования в наших представлениях (Листинг 4.1).

Листинг 4.1. Шаблон сайта Пример приложения.
app/views/layouts/application.html.erb
  <!DOCTYPE html>
  <html>
    <head>
      <title>Ruby on Rails Tutorial Sample App | <%= @title %></title>
      <%= csrf_meta_tag %>
    </head>
    <body>
      <%= yield %>
    </body>
  </html>

Этот шаблон хорошо работает, но есть одна его часть, которую можно немного отполировать. Напомним, что строка заголовка (тайтла)

  Ruby on Rails Tutorial Sample App | <%= @title %>

опирается на определение @title в действии (actions), такое как

  class PagesController < ApplicationController

    def home
      @title = "Home"
    end
    .
    .
    .

Но что, если мы не определим @title переменную? Это хорошее соглашение - иметь базовый заголовок, который мы используем на каждой странице, с дополнительным переменным заголовком (тайтлом), если мы хотим быть более конкретными. Мы уже почти достигли этого с нашей текущей схемой, с одним маленьким недостатком: как вы можете видеть, если вы удалите назначение @title в одном из действий, в отсутствие @title переменной название будет выглядеть следующим образом:

  Ruby on Rails Tutorial Sample App | 

Другими словами, есть подходящий базовый заголовок (тайтл), но есть также прицепленная вертикальная черта | в конце заголовка.

Одним принятым способом справиться с этим случаем, является определение helper (помощник, хелпер), который является функцией предназначенной для использования в представлениях. Давайте определим title помощник, который возвращает базовый заголовок, “Ruby on Rails Tutorial Sample App”, если @title переменная не определена и добавляет вертикальную черту перед переменным заголовком, если @title определена (Листинг 4.2).1

Листинг 4.2. Определение title помощника (хелпера).
app/helpers/application_helper.rb
  module ApplicationHelper

    # Return a title on a per-page basis.
    def title
      base_title = "Ruby on Rails Tutorial Sample App"
      if @title.nil?
	base_title
      else
	"#{base_title} | #{@title}"
      end
    end
  end

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

Теперь у нас есть помощник (хелпер), и мы можем использовать его для упрощения нашего макета, заменив

  <title>Ruby on Rails Tutorial Sample App | <%= @title %></title>

на

  <title><%= title %></title>

как видно в Листинге 4.3. Обратите внимание, в частности, на переход от переменной экземпляра @title к методу помощника title (без @ знака). Используя Autotest или rspec spec/, вы можете убедиться, что тесты из Главы 3 все еще проходят.

Листинг 4.3. Макет сайта Пример приложения.
app/views/layouts/application.html.erb
  <!DOCTYPE html>
  <html>
    <head>
      <title><%= title %></title>
      <%= csrf_meta_tag %>
    </head>
    <body>
      <%= yield %>
    </body>
  </html>
# coding: utf-8