- Модели в Rails приложении
- Обратные вызовы (Callbacks)
- Миграции
Миграции - это компонент Rails для изменения схемы базы данных.
Каждая мигарция представляет собой Ruby класс в котором определён метод change или методы up и down. Метод change используется в том случае когда Rails может самостоятельно вывести обратное действие. Например при добавлении новой колонки в таблицу метод add_column можно использовать внутри метода change. Rails самостоятельно поймёт что при откате миграции колонку нужно удалить. Доступные методы для использования внутри change указаны в документации:
Обратные вызовы - это методы которые вызываются автоматически при наступлении определённого события в жизненном цикле объекта.
Нам понадобится новая модель для представления сущности задачи. Давайте ещё раз пройдёмся по пути от анализа предметной области до создания файла в Rails приложении.
Итак, у пользователя есть задачи. Понятно что можно представить задачу в виде существующих типов данных в Ruby, например, в виде хэша (ключ - название задачи, значение - её прогресс) или просто в виде строки. Но нам, очевидно, потребуется дополнительное поведение для этой сущности. Например, метод для увеличения прогресса задачи, метод для проверки установлена ли задача в контекст (то есть да над которой мы сейчас работаем) и ещё многое. Это приводит нас к мысли о создании нового типа данных - класса Task.
Следующий вопрос на который мы должны ответить, как этот новый класс размещается в нашем Rails приложении. Явно это не контроллер, потому что класс Task представляет сущность реального мира, описывает состояние (хранит данные) этой сущности и также описывает поведение (методы) сущности. Это конечно же не представление и также не похоже на сервис или презентер (ещё будем о них говорить). Таким образом, приходим к пониманию что этот класс разумно считать Моделью.
С помощью генератора Rails создайте новую модель Task. Предусмотрите поля:
-
progressдля хранения прогресса задачи -
contentдля хранения содержания задачи -
completedпризнак того является ли задача завершённой -
currentпризнак того находится ли задача в контексте
Мы написали коллбэк и метод для генерации hashed_password. Однако сейчас этот код находится в модели User. По сути, это самостоятельный фрагмент функциональности который удобно поместить в отдельный модуль.
Создайте модуль User::Authentication в файле /app/models/user/authentication.rb и переместите туда код связанный с аутентификацией, включая коллбэк.
Напишите метод User.authenticate который принимает email пользователя и пароль. Если данные верны, возвращается объект пользователя, если нет - возвращается nil. Метод должен находится в модуле User::Authentication.
Если при создании пользователя значение для поля name не было указано, определите обратный вызов который будет устанавливать это поле в значение по умолчанию. Значение по умолчанию можно сгенерировать с помощью Gem-а Faker.
- GeekBrains
- Электронная почта:
[email protected] - Slack канал