Rinat Shaykhutdinov

Ruby developer, DJ, musician from St. Petersburg, Russia

Используем модели без привязки к базе данных

Наверняка каждому разработчику приходилось сталкиваться с формами, данные в которых необходимо как-то обработать, но при этом не сохранять в базу. Для таких случаев в Rails 3 есть модуль ActiveModel, который позволяет обычные Ruby-модели вести себя как ActiveRecord-модели. Подробности под катом.

Предположим, что вам необходимо реализовать на сайте простейшую форму обратной связи — имя, e-mail и текст сообщения. Обычно, код контроллера, обрабатывающего отправку формы выглядит примерно вот так:

А что если полей будет не 3, а, допустим, 10 и всех их нужно будет валидировать по-разному? И вообще, валидация — дело модели, а не контроллера. Но при отправке письма нам не нужно создавать, записи в базе, соответственно, использовать ActiveRecord-модель — не совсем наш вариант. Но мы можем пойти другим путём!

Теперь FeedbackForm ведёт себя как стандартная рельсовая модель — мы можем рисовать для неё формы с помощью

form_for @feedback_form, url: send_email_path

и использовать стандартную рельсовую валидацию. Да, код стал чуть объёмнее, но возросла читаемость кода и его расширяемость. В ближайших постах я подробно расскажу об использовании других модулей ActiveModel.

8 октября 2011 г.