Brewpedia — это SaaS-приложение Ruby on Rails, вдохновленное Википедией, где пользователи могут создавать и совместно работать над вики-сайтами на основе Markdown.
Объяснение
Как и во многих проектах веб-приложений, создание копии того, что мы хорошо знаем, — отличный способ понять, что происходит за кулисами, и получить четкое направление для создания.
Этот проект был частью программы Bloc Full Stack Developer, направленной на укрепление основ внутреннего программирования и углубление моих знаний о Ruby on Rails. Мне дали набор пользовательских историй и поручили создать веб-приложение с нуля, чтобы удовлетворить каждую из этих потребностей и принять все дизайнерские решения.
Цели проекта
- Пользователи могут зарегистрировать бесплатную учетную запись, указав имя пользователя, пароль и адрес электронной почты.
- Пользователи могут входить и выходить из Brewpedia
- Пользователи со стандартной учетной записью могут создавать, читать, обновлять и удалять общедоступные вики.
- Доступные роли пользователей: администратор, стандарт или премиум. Стандартная учетная запись — это роль по умолчанию, назначаемая новым пользователям.
- Пользователи могут обновить учетную запись со стандартной до премиум-учетной записи и понизить свою учетную запись обратно до стандартной.
- Пользователи могут создавать частные вики. При понижении их учетной записи все частные вики становятся общедоступными.
- Пользователи могут редактировать вики, используя синтаксис Markdown.
- Пользователи могут добавлять и удалять соавторов для частных вики.
Решение
Создавая приложение с нуля, мне пришлось инициировать приложение и создать все необходимые модели и контроллер. Я начал с контроллера приветствия и представлений для простого старта.
Создав вручную аутентификацию и авторизацию пользователя в моем предыдущем проекте Rails, я использовал Devise Gem для другого опыта в этом проекте. После установки Devise я сгенерировал модель Devise User и определил необходимые мне модули Devise, а затем интегрировал SendGrid для отправки писем с подтверждением в рабочей среде. Figaro Gem использовался здесь для безопасной настройки имени пользователя и пароля SendGrid.
Я хотел, чтобы пользователи могли просматривать приветствие и представления без входа в систему, поэтому я использовал skip_before_action
в обратном вызове authenticate_user!
в контроллере приветствия, чтобы добиться этого. Я также установил представления Devise, чтобы позже можно было их настроить.
После настройки регистрации, входа и выхода следующим шагом было создание модели вики, контроллера вики и представлений вики. Я установил модель вики на belongs_to :user
и проверил длину и наличие заголовка и тела вики. В вики-контроллере были определены все действия CRUD и настроены маршруты/ресурсы. Также были созданы представления index, show, new и edit Wikis. На этом этапе пользователи могут просматривать, создавать, редактировать и удалять общедоступные вики.
Чтобы настроить несколько ролей, я использовал enum role:
в модели пользователя с атрибутами для :standard, :premium and :admin
. Затем я использовал обратный вызов after_initialize
, чтобы установить стандартную роль по умолчанию.
Я установил Pundit Gem для авторизации. Я использовал scope
Pundit, чтобы ограничить, какие вики появляются на странице частного вики-индекса для каждого пользователя, добавив внутренний класс Scope
к wiki_policy.rb
. Я также определил уничтожить в wiki_policy.rb
, чтобы только администратор или создатель вики мог удалить вики.
Затем я интегрировал Stripe Gem для обработки платежей при взимании платы с пользователей перед обновлением их учетной записи со стандартной до премиальной. Здесь снова использовался Figaro Gem для безопасной настройки ключей Stripe. Stripe требовал создания контроллера Charges с новыми действиями и действиями create.
Вернувшись в контроллер Users, я определил метод downgrade
для переключения учетных записей пользователей с премиальных на стандартные. Это также изменяет все частные вики пользователя на общедоступные вики.
Чтобы создать частные вики, я добавил флажок в части вики, используемый в представлениях создания и редактирования, чтобы изменить атрибут :private
с false на true. Флажок виден только администраторам и премиум-пользователям. Я также интегрировал Redcarpet Gem для разбора синтаксиса Markdown на всех вики.
Наконец, я создал функциональность для добавления и удаления соавторов на частных вики. Я создал модель Collaborator, контроллер Collaborators и представления Collaborators. Таблица Collaborators соединяется с таблицами Wiki и User через отношение Has Many Through. Я устанавливаю эту связь, используя ассоциации Rails в моделях Wiki, User и Collaborator.
Для представлений Collaborator я создал частичную форму, которая будет добавлена в представление редактирования вики. Я также создал неполный список, который будет использоваться в представлении вики-шоу, чтобы пользователи могли видеть текущих соавторов для каждой вики. В контроллере Collaborators я определил методы создания и уничтожения для добавления и удаления сотрудников из вики.
Результаты
Я настраиваю базу данных разработки для автоматического заполнения пользователями и вики с помощью Faker Gem. Приложение также было протестировано локально, прежде чем оно было запущено в производство на Heroku, и там же было проверено его функционирование.
Все потребности пользователей были успешно удовлетворены.
Вывод
Как мое второе приложение Ruby on Rails, Brewpedia позволила мне гораздо глубже понять создание приложения Rails. Я чувствую, что понял каждый шаг процесса и движущиеся части более полно, чем в своем первом приложении Rails, и мне понравилось создавать все действия CRUD и настраивать структуру базы данных.
Приступая к этому проекту, я только создал свою собственную аутентификацию и авторизацию пользователей, поэтому я не был уверен, насколько сложной будет интеграция Devise и Pundit. Я был приятно удивлен доступной документацией и информацией о том, как интегрировать каждый из них. Включить Devise было просто, но в первый раз мне пришлось внимательно прочитать документацию, чтобы понять все движущиеся части и то, как настроить некоторые представления. Pundit тоже не был слишком сложным, хотя мне потребовалось немного больше времени, чтобы изучить и понять, как настроить политики.
Одной из моих любимых частей в этом проекте была интеграция Stripe для обработки платежей. Меня заинтриговал доступ к сторонним API для использования различных функций или информации, и я был рад получить больше опыта работы с API. И, конечно же, было интересно наблюдать за увеличением баланса моей учетной записи Stripe с каждым тестовым прогоном.
Я был действительно удивлен тем, насколько мне понравилось создавать таблицу соединений для совместной работы. Это было интригующе и вдохновило меня пройти несколько курсов Treehouse по SQL, включая SQL для начинающих, изменение данных с помощью SQL, запросы к реляционным базам данных и создание отчетов с помощью SQL. Эти курсы помогли мне лучше понять взаимосвязи баз данных и способы доступа к информации.
Область, в которой я, вероятно, больше всего боролся, была с маршрутами и ресурсами. К концу и после некоторых исследований я лучше понял, но все же планирую пройти курс Treehouse по маршрутам и ресурсам Rails, так как это важная часть настройки.
Я не знал, что делать с дизайном, пока не реализовал Faker Gem с данными для заполнения базы данных. Лента данных о кофе послужила источником вдохновения для всего приложения, которое было интересно воплотить в жизнь.
Это был проект, в который я влюбился в Ruby on Rails!