арр
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.
Читать дальше
Конец ознакомительного отрывка
Купить книгу