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.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 все еще проходят.
app/views/layouts/application.html.erb
<!DOCTYPE html> <html> <head> <title><%= title %></title> <%= csrf_meta_tag %> </head> <body> <%= yield %> </body> </html>