Схемы баз данных находятся в каталоге 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 большое значение имеет понятие стенда. 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). Это небольшие автономные