Создание Ruby on Rails с нуля

  • День 1: От ничего к чему-то
  • День 2: Больше вещей об отношениях, тестах и т. д.
  • День 3: Мои мысли о Ruby

Я уже давно сменил работу, поэтому мне потребуется некоторое время, чтобы разобраться в архитектуре и сервисах новой организации. Однако, чтобы практиковать свой английский и делать заметки, я по-прежнему буду стараться писать как можно чаще, раз в неделю, но содержание будет отличаться от того, что было раньше: от введения в архитектуру программного обеспечения до моего опыта изучения Ruby.

Потому что язык программирования, используемый на моей новой работе — Ruby, а у меня нет опыта работы с Ruby раньше. Поэтому эта серия будет посвящена перспективе человека, который уже знает несколько языков, и тому, как быстро начать работу с Ruby on Rails, не для того, чтобы написать идеальный Ruby, а для того, чтобы быстро создать работоспособное приложение. Кстати, это немного похоже на то, как я учил английский, нет никакой структуры, все просто работает и можно общаться в любом случае.

Установка

Моя рабочая машина — MacPro M1, поэтому все операции будут выполняться на Mac. M1 также является очень важным ключевым словом, и на M1 я наступил на несколько ловушек, которые будут описаны в одной из последующих статей.

Поскольку мне нужно установить много версий Ruby, я использую решение, аналогичное nvm, rvm.

Чтобы установить rvm на Mac, сначала нужно установить gnupg.

$ brew install gnupg

Затем просто следуйте инструкциям на официальном сайте.

$ gpg —recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3 7D2BAF1CF37B13E2069D6956105BD0E739499BDB
$ curl -sSL https://get.rvm.io | bash
$ rvm install 2.7
$ rvm 2.7 —default

Наконец, просто установите Rails. Я знаю, что уже существуют более новые версии Rails, но ресурсы, которые у меня есть под рукой, основаны на 5.x, поэтому я решил установить 5.2.8.

$ gem install rails -v 5.2.8

Начните создавать приложение Rails

Сначала позвольте мне описать мою цель. Я хочу сделать простой веб-магазин с двумя объектами, user и store, где отношения между этими двумя объектами являются связью один-к-одному. Также, используя MongoDB вместо встроенного SQLite.

Создание Rails-приложения может быть легко осуществлено с помощью scaffold, который предоставляет полностью основанный на ресурсах, стандартный RESTful API.

Начните с создания проекта.

$ rails new hello_rails
$ cd hello_rails
$ bin/rails server

На данный момент приложение создано и работает на порту 3000. Подключитесь напрямую к http://localhost:3000 и вы увидите страницу приветствия.

Далее мы создаем первую модель, начиная с имени и фамилии пользователя.

$ bin/rails generate scaffold User first_name last_name
$ bin/rails db:migrate

Модель пользователя уже создана, и если вы подключитесь напрямую к http://localhost:3000/users, то обнаружите, что сгенерирован не только API, но и базовый пользовательский интерфейс.

Мы еще даже не написали ни строчки кода!

Создание новых маршрутов

Поскольку у нас уже есть базовый API, я хотел бы сгенерировать несколько новых маршрутов API. Давайте возьмем для примера маршруты, не основанные на ресурсах, и маршруты, основанные на ресурсах.

Сначала маршрут, не основанный на ресурсах. Я хочу создать функцию подсчета пользователей, поэтому мне нужен /users/count. Я приложу конкретный процесс непосредственно в коммите на Github.

В общем, что нам нужно сделать, это модифицировать config/routes.rb и создать подсчет соответствующего контроллера и представления.

Далее идет маршрутизация на основе ресурсов, концепция похожа, также приложена ссылка на коммит.

Разница между ними только в config/routes.rb, где маршруты, не основанные на ресурсах, строятся поверх collection, а маршруты, основанные на ресурсах, строятся на member.

Создание новых полей

Теперь у нас есть два поля в модели пользователя, first_name и last_name, и мы добавим дополнительные поля, такие как gender и age, и добавим некоторые ограничения к каждому полю.

Например, first_name и last_name должны присутствовать и не могут быть пустыми. Пол должен быть одним из мужского, женского или другого. Наконец, возраст должен быть натуральным числом.

Давайте начнем с добавления поля gender, то есть с коммита Github.

Самое важное изменение находится в app/models/user.rb. В дополнение к новым полям, мы также добавляем ограничения существующих полей. Конечно, не забудьте запустить миграцию после изменения модели.

$ bin/rails db:migrate

Как видите, добавить возраст так же просто, как сделать коммит на Github.

От SQLite к MongoDB

Мы реализовали модель пользователя в SQLite, но SQLite является локальной базой данных и не может быть использована для распределенных систем. Поэтому мы перейдем на автономную базу данных и будем использовать MongoDB, которая является более гибкой в плане схем, для последующей разработки.

Весь процесс миграции следует официальной документации.

Я также прилагаю полный коммит на Github.

Сначала перепишем модель, удалив ApplicationRecord и добавив Mongoid с его полями. Далее полностью удаляем все места, где в исходном коде используются active_record и active_storage (а это совсем немного).

Послесловие

Должно появиться еще несколько статей о расширении этого приложения, которое является моим первым шагом в Rails.

Я уже сталкивался со многими различными языками бэкенда, включая Python, Golang и Node, но ни один из них не является таким дружественным, как Ruby on Rails.

Из этой статьи легко понять, что построить «стандартный» RESTful API с помощью Rails очень просто, и если у вас нет никаких особых потребностей, вам даже не придется писать ни строчки кода.

Почему стоит делать акцент на стандартных RESTful API?

На самом деле, API, которые я писал в прошлом, не такие уж RESTful, например, ${resource}/${id}, а затем предоставляют операции GET, POST и DELETE, такая строгая маршрутизация, если она не генерируется самим фреймворком, я думаю, мало кому понравится.

Но Rails предоставляет простой scaffold для упрощения работы, и даже встроены модульные тесты, как описано в одной из последующих статей.

Хотя я потратил несколько дней на знакомство с Ruby и Rails, все равно требуется немного времени, чтобы переварить и систематизировать, поэтому позвольте мне взять несколько недель, чтобы закончить свои мысли о Ruby. Но я должен сказать, что Rails поражает меня. Я вижу повсюду блестящие идеи, и в нем есть множество паттернов проектирования. Хотя было немного больно изучать новый язык и фреймворк, я все равно получил от этого некоторые знания.

Оцените статью
devanswers.ru
Добавить комментарий