Хэл Фултон - Программирование на языке Ruby
Базы данных описываются в файле config/database.yaml — одном из немногих необходимых конфигурационных файлов (конечно же, в формате YAML). В нем перечислены три разных базы данных: для разработки, для тестирования и для промышленной эксплуатации. На первый взгляд, это перебор, но в действительности такая схема оказывается очень удобной.
Rails генерирует для вас пустые модели и контроллеры. В ходе редактирования моделей вы определяете связи между таблицами базы данных с помощью таких методов, как has_many и belongs_to (на самом деле их гораздо больше). Поскольку между моделями и таблицами есть соответствие, то написанный вами код заодно определяет и связи между самими моделями. Для контроля данных служат такие методы, как validates_presence_of (проверяет, что данные присутствуют) и validates_uniqueness_of (проверяет, что данные уникальны).
В результате создания приложения Rails командой вида rails appname вы получаете каталог appname с такой структурой:
арр
controllers
helpers
models
views
config
db
doc
lib
log
public
script
test
vendor
Большая часть кода находится в каталоге арр. Как видите, сама его структура следует паттерну MVC.
Схемы баз данных находятся в каталоге db. Инкрементные файлы миграции тоже попадут сюда.
В Rails есть концепция «обстраивания» (scaffolding), которая очень упрощает жизнь. Если ввести команду script/generate scaffold Product (Product — имя модели), то для таблицы Products (обратите внимание на множественное число) будет сгенерирована функциональность «создать-обновить-удалить».
Можно обстроиться и не генерируя никакой код, достаточно вызвать внутри контроллера Product метод scaffold:
class ProductController < ActiveRecord::Base
scaffold :product
end
Здесь мы достигаем той же цели, но не записываем никакой код на диск. Оба способа допустимы. Конечно, в результате обстраивания создаются страницы ввода/обновления, которые вполне функциональны, но не слишком красивы; почти всегда вы захотите заменить их чем-то более симпатичным. Тем не менее такая техника взаимодействия с базой данных полезна, особенно на этапе разработки.
В старых версиях Rails расхождение между ActiveRecord и базой данных было более существенным. Недавно появившаяся концепция миграции делает управление базой данных проще. То же касается и уже существующих в базе данных таблиц, работать с которыми было трудно; сейчас можно создать файл schema.rb, в котором будет перечислены все существующие таблицы (см. также rake tasks db:schema:load и db:schema:dump).
19.3.2. Тестирование и отладка приложений Rails
В Rails встроена серьезная поддержка тестирования. Обратите внимание на каталог test, который создается для каждого нового приложения. Он заполняется по мере развития приложения; вы можете (и должны) добавлять тесты по ходу создания новой функциональности.
По принятому в Rails соглашению, автономные тесты служат для тестирования моделей, а функциональные — для тестирования контроллеров. Этим объясняется наличие подкаталогов unit и functional в каталоге test. (Вне контекста Ruby on Rails эти термины используются несколько иначе.)
Для тестирования в Rails большое значение имеет понятие стенда. Стенд (fixture) — это моментальный снимок начального содержимого модели, иными словами, набор фиктивных данных для тестирования. Все данные такого рода хранятся в формате YAML в файлах, расположенных в каталоге test/fixtures.
Каталог test/mocks предназначен для хранения кода, играющего роль объекта-заглушки. Заглушки служат для имитации еще не реализованного сервиса или класса. Считайте это подобием голливудской декорации, которая только внешне похожа на реальность. Классический пример — шлюз в систему обработки кредитных карт; с помощью заглушек мы можем протестировать взаимодействие с ним, не имея настоящего шлюза.
Следует также знать о понятии консоли в Rails. Запуск сценария script/console открывает сеанс, похожий на irb, в котором доступен код модели. В нем вы можете выполнять запросы с помощью ActiveRecord и другие подобные операции.
Еще полезнее прерыватель (breakpointer). Расположите в любом месте своей программы вызов метода breakpoint и запустите утилиту script/breakpointer. Вы окажетесь в сеансе irb в контексте установленной точки прерывания и сможете просматривать и изменять значения переменных экземпляра и т.п.
В последних версиях Rails появилась также поддержка для тестирования сопряжений. Для этого применяется специализированный язык DSL, описывающий поток управления в Web-приложении на верхнем уровне. Он ориентирован на заказчиков, не имеющих технической подготовки, но пригодится и тем пользователям, которые хорошо знакомы с внутренним устройством приложения.
19.3.3. Базовые расширения
Одно из достоинств Rails — наличие широкого набора вспомогательных методов, определенных в модуле ActiveSupport::CoreExtensions. Они «безвредны» и после добавления в основные классы становятся доступны всему приложению.
Некоторые из этих методов имеют отношение к работе с датами и временем. Поскольку внутри системы время хранится в секундах, то имеют смысл методы minutes и hours:
elapsed = 3.days + 4.hours + 17.minutes
later = Time.now + elapsed
Можно делать и такие вещи:
time = 3 .minutes.from_now # To же, что Time.now + 3.minutes.
t2 = 5.days.from_now
Операции со временем представлены особенно полно. С помощью методов midnight, next_month и beginning_of_week можно точно и кратко задавать моменты времени.
Один из самых известных трюков в этом модуле — метод Symbol#to_proc. Он позволяет передавать символ, представляющий имя метода, вместо блока. Например, следующие два предложения эквивалентны:
arr = array.map {|x| x.upcase }
arr = array.map(&:upcase)
Помимо упомянутых здесь методов, есть еще десятки других. Одни занимаются преобразованием различных единиц измерения времени, другие — переводом из YAML или XML, третьи — проверкой правописания и расстановкой знаков препинания в строках и т.д.
19.3.4. Дополнительные инструменты и библиотеки
Неизбежным было появление внешних инструментов для работы с Rails. Например, в редактор TextMate встроена неплохая поддержка (синтаксическая подсветка, автоматическое дописывание кода и т.д.). Этот редактор, наверное, самый популярный среди программистов на Ruby на платформе OS X.
Многообещающим выглядит проект InstantRails (http://instantrails.rubyforge.org). Это единый пакет, содержащий Ruby, Rails, MySQL и Apache, причем все продукты уже сконфигурированы и готовы к работе. Первая версия работает только в Windows, но планируется перенос на другие платформы.
На платформе OS/X есть эквивалентный проект Locomotive. Это достаточно зрелая и хорошо работающая среда для развертывания Rails «одним щелчком».
Если вы поклонник проекта Eclipse, то должны знать о RadRails — интегрированной среде разработки для Rails, надстроенной над Eclipse. На сайте проекта (http://radrails.org) написано, что «продукт поддерживает управление версиями, отладку, серверы WEBrick, мастер генерации кода, синтаксическую подсветку, инструменты для работы с данными и многое другое». Он должен работать на всех платформах, где работает сам Eclipse.
Важно также понимать, что такое подключаемые к Rails модули (plugins). Это небольшие автономные программы, которые модифицируют поведение ActiveRecord или Rails. Их несложно писать и развертывать.
Для установки подключаемого модуля достаточно раскрыть архив и скопировать его в каталог vendor/plugins. Примером может служить хорошо известный модуль аннотирования (Annotate models), написанный Дэйвом Томасом. Он добавляет в начало каждого исходного файла модели ActiveRecord комментарии, содержащие краткую аннотацию текущей схемы (эта функциональность становится доступной с помощью задачи rake). Существуют сотни небольших подключаемых модулей, занимающихся аутентификацией, генерацией GUID, интернационализацией, поддержкой CSS и т.д.
Невозможно описать Rails на нескольких страницах — этой теме посвящены целые книги, причем самые первые к лету 2006 года уже устарели. Если вы хотите углубить свои познания в этой области, заходите на сайт http://rubyonrails.org — основное место встреч сообщества пользователей Rails.
19.4. Разработка Web-приложений с помощью Nitro
Nitro — еще один комплект инструментов для разработки Web-приложений. Хотя в сочетании с библиотекой Og для объектно-реляционного отображения Nitro хорошо приспособлен к созданию традиционных приложений в духе MVC, задуман он для поддержки различных архитектур.