День 1: От ничего к чему-то

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

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

Монтаж

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

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

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

$ варить установить gnupg

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

$ gpg — recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3 7D2BAF1CF37B13E2069D6956105BD0E739499BDB
$ curl -sSL https://get.rvm.io | bash
$ rvm install 2.7
$ rvm 2.7 — по умолчанию

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

$ gem install rails -v 5.2.8

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

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

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

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

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

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

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

$ bin/rails generate scaffold Имя пользователя last_name
$ bin/rails db:migrate

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

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

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

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

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

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

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

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

Создать новые поля

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

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

Начнем с добавления поля пол, то есть Github commit.

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

$ bin/rails db:migrate

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

От SQLite к MongoDB

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

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

Также прикрепляю полный Github commit.

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