ББК 32.988.02-018 УДК 004.738.5 Р82 Руби С., Томас Д., Хэнссон Д. Р82 Rails 4. Гибкая разработка веб-приложений. — СПб.: Питер, 2014. — 448 с.: ил. — (Серия «Для профессионалов»). ISBN 978-5-496-00898-3 Перед вами новое издание бестселлера «Agile web development with Rails», написанного Сэмом Руби — руководителем Apache Software Foundation и разработчиком формата Atom, Дэйвом Тома- сом — автором книги «Programming Ruby», и Дэвидом Хэнссоном — создателем технологии Rails. Rails представляет собой среду, облегчающую разработку, развертывание и обслуживание веб- приложений. За время, прошедшее с момента ее первого релиза, Rails прошла путь от малоизвест- ной технологии до феномена мирового масштаба и стала именно той средой, которую выбирают, чтобы создавать так называемые «приложения Web 2.0». Эта книга, уже давно ставшая настольной по изучению Ruby on Rails, предназначена для всех про- граммистов, собирающихся создавать и развертывать современные веб-приложения. Из первой части книги вы получите начальное представление о языке Ruby и общие сведения о самой среде Rails. Далее на примере создания интернет-магазина вы изучите концепции, положенные в основу Rails. В третьей части рассматривается вся экосистема Rails: ее функции, возможности и дополнительные модули. Обновленное издание книги описывает работу с Rails поколения 4 и Ruby 1.9 и 2.0. ББК 32.988.02-018 УДК 004.738.5 Права на издание получены по соглашению с Pragmatic Bookshelf. Все права защищены. Никакая часть данной книги не может быть воспроизведена в какой бы то ни было форме без письменного разрешения владельцев авторских прав. Информация, содержащаяся в данной книге, получена из источников, рассматриваемых издательством как надежные. Тем не менее, имея в виду возможные человеческие или технические ошибки, издательство не может гарантировать абсолютную точность и полноту приводимых сведений и не несет ответственности за возможные ошибки, связанные с использованием книги. ISBN 978-1937785567 (англ.) © 2011 P ragmatic Bookshelf, LLC. ISBN 978-5-496-00898-3 © Перевод на русский язык ООО Издательство «Питер», 2014 © Издание на русском языке, оформление ООО Издательство «Питер», 2014 Оглавление Благодарности . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .10 Введение . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .12 Rails является средством гибкой разработки . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 Для кого предназначена эта книга . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 Как нужно читать эту книгу . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 От издательства . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 Часть I. Начало . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .19 Глава 1. Установка Rails..........................................20 1 .1 . Установка под Windows . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 1 .2 . Установка под Mac OS X . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 1 .3 . Установка под Linux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23 1 .4 . Выбор версии Rails . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25 1 .5 . Настройка среды разработки . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26 1 .6 . Rails и базы данных . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29 Наши достижения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31 Глава 2. Немедленное использование...............................32 2 .1 . Создание нового приложения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32 2 .2 . Привет, Rails! . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34 2 .3 . Соединение страниц . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42 Наши достижения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45 Глава 3. Архитектура Rails-приложений ............................47 3 .1 . Модели, представления и контроллеры . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47 3 .2 . Поддержка модели Rails . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50 3 .3 . Action Pack: представление и контроллер . . . . . . . . . . . . . . . . . . . . . . . . . . . 52 Глава 4. Введение в Ruby.........................................55 4 .1 . Ruby — объектно-ориентированный язык . . . . . . . . . . . . . . . . . . . . . . . . . . 56 4 .2 . Типы данных . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58 4 .3 . Логика . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61 4 .4 . Организационные структуры . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64 4 .5 . Маршализированные объекты . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67 6 Оглавление 4 .6 . А теперь все вместе . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67 4 .7 . Идиомы, используемые в Ruby . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69 Часть II. Создание приложения . . . . . . . . . . . . . . . . . . . . . . . . . .71 Глава 5. Интернет-магазин .......................................72 5 .1 . Поэтапная разработка . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72 5 .2 . Для чего предназначен Depot . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73 5 .3 . А теперь приступим к программированию . . . . . . . . . . . . . . . . . . . . . . . . . . 77 Глава 6. Задача А: создание приложения............................79 6 .1 . Шаг A1: создание приложения по учету товаров . . . . . . . . . . . . . . . . . . . . 79 6 .2 . Шаг А2: улучшение внешнего вида перечня товаров . . . . . . . . . . . . . . . . 87 Наши достижения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92 Глава 7. Задача Б: проверка приемлемости данных и блочное тестирование........................................95 7 .1 . Шаг Б1: проверка приемлемости данных . . . . . . . . . . . . . . . . . . . . . . . . . . . 95 7 .2 . Шаг Б2: блочное тестирование моделей . . . . . . . . . . . . . . . . . . . . . . . . . . .100 Наши достижения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .108 Глава 8. Задача В: отображение каталога товаров ...................110 8 .1 . Шаг В1: создание каталога товаров . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .111 8 .2 . Шаг В2: добавление макета страницы . . . . . . . . . . . . . . . . . . . . . . . . . . . . .115 8 .3 . Шаг В3: использование помощника для форматирования цены . . . .119 8 .4 . Шаг В4: функциональное тестирование контроллеров . . . . . . . . . . . . .120 8 .5 . Шаг В5: Кэширование неполных результатов . . . . . . . . . . . . . . . . . . . . . .122 Наши достижения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .124 Глава 9. Задача Г: создание корзины покупателя ....................126 9 .1 . Шаг Г1: обнаружение корзины . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .126 9 .2 . Шаг Г2: связывание товаров с корзинами . . . . . . . . . . . . . . . . . . . . . . . . . .127 9 .3 . Шаг Г3: добавление кнопки . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .130 Наши достижения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .135 Глава 10. Задача Д: усовершенствованная корзина ..................137 10 .1 . Шаг Д1: создание усовершенствованной корзины . . . . . . . . . . . . . . . .137 10 .2 . Шаг Д2: обработка ошибок . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .143 10 .3 . Шаг Д3: завершение разработки корзины . . . . . . . . . . . . . . . . . . . . . . . .147 Наши достижения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .150 Глава 11. Задача Е: добавление AJAX..............................152 11 .1 . Шаг Е1: перемещение корзины . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .153 11 .2 . Шаг Е2: создание корзины на основе AJAX-технологии . . . . . . . . . . .159 Оглавление 7 11 .3 . Шаг Е3: выделение изменений . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .163 11 .4 . Шаг Е4: предотвращение отображения пустой корзины . . . . . . . . . . .166 11 .5 . Шаг Е5: придание изображениям восприимчивости к щелчкам . . .169 11 .6 . Тестирование изменений, внесенных при добавлении AJAX . . . . . .171 Наши достижения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .174 Глава 12. Задача Ж: оформление покупки..........................176 12 .1 . Шаг Ж1: регистрация заказа . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .176 12 .2 . Шаг Ж2: применение Atom-канала . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .189 Наши достижения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .193 Глава 13. Задача З: отправка электронной почты ....................194 13 .1 . Шаг З1: отправка подтверждающих электронных сообщений . . . . .194 13 .2 . Шаг 32: комплексное тестирование приложений . . . . . . . . . . . . . . . . . .202 Наши достижения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .207 Глава 14. Задача И: вход в административную область ...............208 14 .1 . Шаг И1: добавление пользователей . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .209 14 .2 . Шаг И2: аутентификация пользователей . . . . . . . . . . . . . . . . . . . . . . . . .214 14 .3 . Шаг И3: ограничение доступа . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .219 14 .4 . Шаг И4: добавление боковой панели и дополнительных административных функций . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .222 Наши достижения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .226 Глава 15. Задача К: локализация..................................228 15 .1 . Шаг К1: выбор региона . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 229 15 .2 . Шаг К2: перевод каталога товаров . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .233 15 .3 . Шаг К3: перевод оформления заказа . . . . . . . . . . . . . . . . . . . . . . . . . . . . .239 15 .4 . Шаг К4: добавление переключателя локализации . . . . . . . . . . . . . . . . .245 Наши достижения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .247 Глава 16. Задача Л: развертывание и эксплуатация ..................249 16 .1 . Шаг Л1: развертывание с использованием Phusion Passenger и MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .251 16 .2 . Шаг Л2: удаленное развертывание с помощью Capistrano . . . . . . . . .258 16 .3 . Шаг Л3: проверка работы развернутого приложения . . . . . . . . . . . . . .264 Наши достижения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .267 Глава 17. Ретроспектива Depot ...................................269 17 .1 . Концепции Rails . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .269 17 .2 . Документирование проделанной работы . . . . . . . . . . . . . . . . . . . . . . . . .272 8 Оглавление Часть III. Углубленное изучение Rails . . . . . . . . . . . . . . . . . . .275 Глава 18. Ориентация в мире Rails ................................276 18 .1 . Где что размещается . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .276 18 .2 . Соглашения об именах . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .284 Наши достижения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .288 Глава 19. Active Record .........................................289 19 .1 . Определение структуры ваших данных . . . . . . . . . . . . . . . . . . . . . . . . . . .289 19 .2 . Определение местоположения записей и прослеживание их связей . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .294 19 .3 . Создание, чтение, обновление, удаление (CRUD — Create, Read, Update, Delete) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .298 19 .4 . Участие в процессе мониторинга . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .313 19 .5 . Транзакции . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .319 Наши достижения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .323 Глава 20. Action Dispatch и Action Controller........................324 20 .1 . Направление запросов контроллерам . . . . . . . . . . . . . . . . . . . . . . . . . . . .325 20 .2 . Обработка запросов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .334 20 .3 . Объекты и операции, расширяющие диапазон действия запросов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .346 Наши достижения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .355 Глава 21. Action View ...........................................356 21 .1 . Использование шаблонов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .357 21 .2 . Создание форм . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .358 21 .3 . Обработка форм . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .361 21 .4 . Выкладывание файлов для Rails-приложений . . . . . . . . . . . . . . . . . . . . 363 21 .5 . Использование помощников . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .367 21 .6 . Сокращение объемов поддержки приложения с помощью макетов и парциалов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .374 Наши достижения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .382 Глава 22. Миграции.............................................383 22 .1 . Создание и запуск миграций . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .384 22 .2 . Внутреннее устройство миграции . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .386 22 .3 . Управление таблицами . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .391 22 .4 . Расширенное применение миграций . . . . . . . . . . . . . . . . . . . . . . . . . . . . .395 22 .5 . Слабая сторона миграций . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .398 22 .6 . Манипуляции со схемой данных вне миграций . . . . . . . . . . . . . . . . . . .399 Наши достижения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .400 Оглавление 9 Глава 23. Приложения, не использующие браузер ...................401 23 .1 . Автономное приложение, использующее Active Record . . . . . . . . . . .402 23 .2 . Библиотечная функция, использующая Active Support . . . . . . . . . . .403 Наши достижения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .407 Глава 24. Зависимости Rails......................................408 24 .1 . Генерирование XML с помощью Builder . . . . . . . . . . . . . . . . . . . . . . . . . .409 24 .2 . Генерирование HTML с помощью ERB . . . . . . . . . . . . . . . . . . . . . . . . . .410 24 .3 . Управление зависимостями с помощью Bundler . . . . . . . . . . . . . . . . . .412 24 .4 . Взаимодействие с веб-сервером с помощью Rack . . . . . . . . . . . . . . . . .415 24 .5 . Автоматизация задач с помощью Rake . . . . . . . . . . . . . . . . . . . . . . . . . . .418 24 .6 . Обзор Rails-зависимостей . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .420 Наши достижения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .423 Глава 25. Дополнительные модули Rails............................424 25 .1 . Обработка кредитных карт с помощью Active Merchant . . . . . . . . . . .424 25 .2 . Украшение нашей разметки с помощью Haml . . . . . . . . . . . . . . . . . . . .426 25 .3 Разбиение на страницы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 429 Наши достижения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .431 25 .4 . Поиск дополнительных модулей на сайте RailsPlugins .org . . . . . . . .432 Глава 26. Куда двигаться дальше..................................434 Алфавитный указатель . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .436 Благодарности Rails постоянно развивается, и вместе с ней изменяется и данная книга . Части при- ложения Depot переписывались по нескольку раз, кроме этого обновлялись все комментарии к этому коду . Исключение ряда средств по мере того как они попа- дали в разряд нерекомендуемых, неоднократно приводило к изменению структуры книги, как только горячее становилось еле теплым . Поэтому данная книга не появилась бы на свет без огромной помощи со сторо- ны сообществ Ruby и Rails . Для начала перечислю очень полезных официальных рецензентов проектов данной книги: Джереми Андерсон (Jeremy Anderson), Andrea Barisone (Андреа Барисо- не), Кен Коар (Ken Coar), Джеф Коэн (Jeff Cohen), Джоел Клермонт (Joel Clermont), Джеф Дрейк (Geoff Drake), Jeremy Frens (Джереми Френс), Паван Горакави (Pavan Gorakavi), Майкл Юревич (Michael Jurewitz), Майкл Линд- саар (Mickel Lindsaar), Nigel Lowry (Нигель Лоури), Stephen Orr (Стефен Орр), Aaron Patterson (Аарон Паттерсон), Пол Рейнер (Paul Rayner), Мар- тин Реверс (Martin Reuvers), Даг Ротен (Doug Rhoten), Гари Шерман (Gary Sherman), Tibor Simic (Тибор Симик), Gianluigi Spagnuolo (Джанлуиджи Спаньюоло), Даванум Шринивас (Davanum Srinivas), Charley Stran (Чар- ли Стран), Federico Tomassetti (Федерико Томассетти), Стефан Туралски (Stefan Turalski) и Хосе Валим (José Valim) . Кроме этого, каждое издание данной книги выпускалось в бета-версии: каждая версия публиковалась в PDF-формате, и люди комментировали ее в Интернете . В результате оставленных ими комментариев поступило более 1000 предложений и сообщений об ошибках . Значительная часть предложений в конечном итоге была принята, что сделало эту книгу намного полезнее . Хотя наша благодарность распространяется на всех, кто поддерживал программу выпуска бета-версии книги и внес в своих отзывах так много ценных предложений, среди них есть люди, которые при этом вносили свой вклад не по долгу службы: Мануэль Э . Видаурре Аренас (Manuel E . Vidaurre Arenas), Сет Арнолд (Seth Arnold), Уилл Боулин (Will Bowlin), Энди Брайс (Andy Brice), Джейсон Ка- тена (Jason Catena), Виктор Мариус Костан (Victor Marius Costan), Дэвид Хэдли (David Hadley), Джейсон Холловей (Jason Holloway), Дэвид Капп