- День 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 поражает меня. Я вижу повсюду блестящие идеи, и в нем есть множество паттернов проектирования. Хотя было немного больно изучать новый язык и фреймворк, я все равно получил от этого некоторые знания.