Table Of ContentББК 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), Дэвид Капп