День 1: От ничего к чему-то
- День 1: От ничего к чему-то
- День 2: Еще об отношениях, тестах и т. д.
- День 3: Мои мысли о Ruby
Я недавно сменил работу, поэтому мне потребуется некоторое время, чтобы изучить архитектуру и услуги новой организации. Тем не менее, чтобы практиковать свой английский и делать заметки, я по-прежнему буду стараться публиковать как можно чаще раз в неделю, но содержание будет отличаться от прошлого, от введения в архитектуру программного обеспечения до моего опыта изучения 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 мне нравится. Я везде вижу гениальные идеи, и в них много дизайнерских паттернов. Хотя изучение нового языка и фреймворка было немного болезненным, я все же получил от этого некоторые идеи.