В модуле 2 я должен был построить полноценный мини-веб-проект. Перебрав несколько идей, я решил выбрать тему зоопарков (просто люблю животных!). Его характеристики следующие:

У нас есть смотритель зоопарка, который отвечает за определенный зоопарк. Один зоопарк равен одной учетной записи смотрителя зоопарка, без совместного использования. Зоопарк может зарегистрироваться, подписаться и выйти из системы, а также — создать свой зоопарк, добавить в него любое количество животных, редактировать и удалять их. Животные, живущие в других зоопарках, читаются только нашим зоокипером. Более того, каждый смотритель зоопарка может редактировать и удалять свои собственные профили, а при удалении они также автоматически удаляют всех животных, которые есть в их зоопарке, чтобы ни один бедняга не остался сиротой.

Незарегистрированные пользователи (которыми являются все, кроме владельцев зоопарков) могут просматривать список всех животных и всех зоопарков. Они имеют права только на чтение и не могут зарегистрироваться, потому что для этого нужна специальная ссылка от администрации сайта, а ссылку можно отправить только по запросу в авторизованные зоопарки (хитрая система, ха?).

Что умеют животные? В основном, просто существовать в зоопарке. Очень близко к нашей реальной жизни.

Я начал с использования Ruby

$ роговица новый драгоценный камень

Это создает красивую структуру приложения. Затем я добавил соответствующие таблицы и классы, контроллеры и представления, пару строк кода в config.ru. Я соединил все компоненты MVC вместе и был очень доволен результатом. Все работало нормально, но подождите….

Как только я начал добавлять валидацию, авторизацию и аутентификацию, ошибки посыпались одна за другой, бесконечно… Даже current_user умудрился испортить мой код. Проблема заключалась в том, что когда, скажем, вошедший в систему зоопарк 1 посещал зоопарк зоопарка 2, имя пользователя зоопарка 1 менялось на пользователя зоопарка 2. Почему это? Магия? Нисколько! Оказалось, что моя переменная экземпляра @zookeeper перезаписала мою функцию def current_user, которая также содержала @zookeeper. Решение было простым: мне просто нужно было переименовать @zookeeper с def current_user на @logged_in_zookeeper — и та-да!

Создание проекта было действительно сложным, но интересным, и я с нетерпением жду следующего модуля, посвященного Rails! Ура!