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!

Просмотреть проект