Предисловие
Благодарности
Об авторе
Введение

Глава 1. Среда и конфигурирование Rails
Запуск
Параметры среды по умолчанию
Начальная загрузка
Пакеты RubyGem
Инициализатор
Подразумеваемые пути загрузки
Rails, модули и код автозагрузки
Встройка Rails Info
Конфигурирование
Дополнительные конфигурационные параметры
Режим разработки
Динамическая перезагрузка классов
Загрузчик классов в Rails
Режим тестирования
Режим эксплуатации
Протоколирование
Протоколы Rails
Анализ протоколов
Syslog
Заключение

Глава 2. Работа с контроллерами
Диспетчер: с чего все начинается
Обработка запроса
Познакомимся с диспетчером поближе
Рендеринг представления
Если сомневаетесь, рисуйте
Явный рендеринг
Рендеринг шаблона другого действия
Рендеринг совершенно постороннего шаблона
Рендеринг подшаблона
Рендеринг встроенного шаблона
Рендеринг текста
Рендеринг структурированных данных других типов
Пустой рендеринг
Параметры рендеринга
Переадресация
Коммуникация между контроллером и представлением
Фильтры
Наследование фильтров
Типы фильтров
Упорядочение цепочки фильтров
Around-фильтры
Пропуск цепочки фильтров
Условная фильтрация
Прерывание цепочки фильтров
Потоковая отправка
send_data(data, options = {})
send_file(path, options = {})
Как заставить сам веб-сервер отправлять файлы
Заключение

Глава 3. Маршрутизация
Две задачи маршрутизации
Связанные параметры
Метапараметры ("приемники")
Статические строки
Файл routes.rb
Маршрут по умолчанию
О поле :id
Генерация маршрута по умолчанию
Модификация маршрута по умолчанию
Предпоследний маршрут и метод respond_to
Метод respond_to и заголовок HTTP-Accept
Пустой маршрут
Самостоятельное создание маршрутов
Использование статических строк
Использование собственных "приемников"
Замечание о порядке маршрутов
Применение регулярных выражений в маршрутах
Параметры по умолчанию и метод url_for
Что случилось с :id
Использование литеральных URL
Маскирование маршрутов
Маскирование пар ключ/значение
Именованные маршруты
Создание именованного маршрута
Что лучше: name_path или name_url?
Замечания
Как выбирать имена для маршрутов
Синтаксическая глазурь
Еще немного глазури?
Метод организации контекста with_options
Заключение

Глава 4. REST, ресурсы и Rails
О REST в двух словах
REST в Rails
Маршрутизация и CRUD
Ресурсы и представления
Ресурсы REST и Rails
От именованных маршрутов к поддержке REST
И снова о глаголах HTTP
Стандартные REST-совместимые действия контроллеров
Хитрость для методов PUT и DELETE
Одиночные и множественные
REST-совместимые маршруты
Специальные пары: new/create и edit/update
Одиночные маршруты к ресурсам
Вложенные ресурсы
Явное задание :path_prefix
Явное задание :name_prefix
Явное задание REST-совместимых контроллеров
А теперь все вместе
Замечания
О глубокой вложенности
Настройка REST-совместимых маршрутов
Маршруты к дополнительным действиям
Дополнительные маршруты к наборам
Замечания
Ресурсы, ассоциированные только с контроллером
Различные представления ресурсов
Метод respond_to
Форматированные именованные маршруты
Набор действий в Rails для REST
index
show
destroy
new и create
edit и update
Заключение

Глава 5. Размышления о маршрутизации в Rails
Исследование маршрутов в консоли приложения
Распечатка маршрутов
Анатомия объекта Route
Распознавание и генерация с консоли
Консоль и именованные маршруты
Тестирование маршрутов
Подключаемый модуль Routing Navigator
Заключение

Глава 6. Работа с ActiveRecord
Основы
Миграции
Создание миграций
Migration API
Определение колонок
Методы в стиле макросов
Объявление отношений
Примат соглашения над конфигурацией
Приведение к множественному числу
Задание имен вручную
Унаследованные схемы именования
Определение атрибутов
Значения атрибутов по умолчанию
Сериализованные атрибуты
CRUD: создание, чтение, обновление, удаление
Создание новых экземпляров ActiveRecord
Чтение объектов ActiveRecord
Чтение и запись атрибутов
Доступ к атрибутам и манипулирование ими
до приведения типов
Перезагрузка
Динамический поиск по атрибутам
Специальные SQL-запросы
Кэш запросов
Обновление
Обновление с условием
Обновление конкретного экземпляра
Обновление конкретных атрибутов
Вспомогательные методы обновления
Контроль доступа к атрибутам
Удаление и уничтожение
Блокировка базы данных
Оптимистическая блокировка
Пессимистическая блокировка
Замечание
Дополнительные средства поиска
Условия
Упорядочение результатов поиска
Параметры limit и offset
Параметр select
Параметр from
Группировка
Параметры блокировки
Соединение и включение ассоциаций
Параметр readonly
Соединение с несколькими базами данных в разных моделях
Прямое использование соединений с базой данных
Модуль DatabaseStatements
Другие методы объекта connection
Другие конфигурационные параметры
Заключение

Глава 7. Ассоциации в ActiveRecord
Иерархия ассоциаций
Отношения один-ко-многим
Добавление ассоциированных объектов в набор
Методы класса AssociationCollection
Ассоциация belongs_to
Перезагрузка ассоциации
Построение и создание связанных объектов через ассоциацию
Параметры метода belongs_to
Ассоциация has_many
Параметры метода has_many
Методы прокси-классов
Отношения многие-ко-многим
Метод has_and_belongs_to_many
Конструкция has_many :through
Параметры ассоциации has_many :through
Отношения один-к­одному
Ассоциация has_one
Параметры ассоциации has_one
Несохраненные объекты и ассоциации
Ассоциации один-к-одному
Наборы
Расширения ассоциаций
Класс AssociationProxy
Методы reload и reset
Методы proxy_owner, proxy_reflection и proxy_target
Заключение

Глава 8. Валидаторы в ActiveRecord
Нахождение ошибок
Простые декларативные валидаторы
validates_acceptance_of
validates_associated
validates_confirmation_of
validates_each
validates_inclusion_of и validates_exclusion_of
validates_existence_of
validates_format_of
validates_length_of
validates_numericality_of
validates_presence_of
validates_uniqueness_of
Исключение RecordInvalid
Общие параметры валидаторов
:allow_nil
:if
:message
:on
Условная проверка
Замечания по поводу применения
Работа с объектом Errors
Манипулирование набором Errors
Проверка наличия ошибок
Нестандартный контроль
Отказ от контроля
Заключение

Глава 9.Дополнительные возможности ActiveRecord
Обратные вызовы
Регистрация обратного вызова
Парные обратные вызовы before/after
Прерывание выполнения
Примеры применения обратных вызовов
Особые обратные вызовы: after_initialize и after_find
Классы обратных вызовов
Наблюдатели
Соглашения об именовании
Регистрация наблюдателей
Момент оповещения
Наследование с одной таблицей
Отображение наследования на базу данных
Замечания об STI
STI и ассоциации
Абстрактные базовые классы моделей
Полиморфные отношения has_many
Случай модели с комментариями
Замечание об ассоциации has_many
Модули как средство повторного использования
общего поведения
Несколько слов об области видимости класса и контекстах
Обратный вызов included
Модификация классов ActiveRecord во время выполнения
Замечания
Ruby и предметно-ориентированные языки
Заключение

Глава 10. ActionView
Основы ERb
Практикум по ERb
Удаление пустых строк из вывода ERb
Закомментирование ограничителей ERb
Условный вывод
RHTML? RXML? RJS?
Макеты и шаблоны
Подстановка содержимого
Переменные шаблона
Защита целостности представления от данных,
введенных пользователем
Подшаблоны
Простые примеры
Повторное использование подшаблонов
Разделяемые подшаблоны
Передача переменных подшаблонам
Рендеринг наборов
Протоколирование
Кэширование
Кэширование в режиме разработки?
Кэширование страниц
Кэширование действий
Кэширование фрагментов
Истечение срока хранения кэшированного содержимого
Автоматическая очистка кэша с помощью дворников
Протоколирование работы кэша
Подключаемый модуль Action Cache
Хранилища для кэша
Заключение

Глава 11. Все о помощниках
Модуль ActiveRecordHelper
Отчет об ошибках контроля
Автоматическое создание формы
Настройка выделения ошибочных полей
Модуль AssetTagHelper
Помощники для формирования заголовка
Только для подключаемых модулей:
добавление включаемых по умолчанию JavaScript-сценариев
Модуль BenchmarkHelper
Модуль CacheHelper
Модуль CaptureHelper
Модуль DateHelper
Помощники для выбора даты и времени
Помощники для задания отдельных элементов
даты и времени
Параметры, общие для всех помощников,
связанных с датами
Методы distance_in_time со сложными именами
Модуль DebugHelper
Модуль FormHelper
Создание форм для моделей ActiveRecord
Как помощники формы получают свои значения
Модуль FormOptionsHelper
Помощники select
Другие помощники
Модуль FormTagHelper
Модуль JavaScriptHelper
Модуль NumberHelper
Модуль PaginationHelper
will_paginate
paginator
Paginating Find
Модуль RecordIdentificationHelper
Модуль RecordTagHelper
Модуль TagHelper
Модуль TextHelper
Модуль UrlHelper
Написание собственных модулей
Мелкие оптимизации: помощник Title
Инкапсуляция логики представления: помощник photo_for
Более сложное представление: помощник breadcrumbs
Обертывание и обобщение подшаблонов
Помощник tiles
Обобщение подшаблонов
Заключение

Глава 12. Ajax on Rails
Библиотека Prototype
Подключаемый модуль FireBug
Prototype API
Функции верхнего уровня
Объект Class
Расширения класса JavaScript Object
Расширения класса JavaScript Array
Расширения объекта document
Расширения класса Event
Расширения класса JavaScript Function
Расширения класса JavaScript Number
Расширения класса JavaScript String
Объект Ajax
Объект Ajax.Responders
Объект Enumerable
Класс Hash
Объект ObjectRange
Объект Prototype
Модуль PrototypeHelper
link_to_remote
remote_form_for
periodically_call_remote
observe_field
observe_form
RJS - пишем Javascript на Ruby
RJS-шаблоны