4.1.1 Тitle helper
Когда мы в последний раз видели наше новое приложение, мы только что обновили наши, в основном статические, страницы использовав Rails шаблон для устранения дублирования в наших представлениях (Листинг 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
title помощника (хелпера). app/helpers/application_helper.rbmodule 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 все еще проходят.
app/views/layouts/application.html.erb<!DOCTYPE html> <html> <head> <title><%= title %></title> <%= csrf_meta_tag %> </head> <body> <%= yield %> </body> </html>