prism

Веб-фреймворк на Ruby, основанный исключительно на стандартной библиотеке - без внешних гемов. Роутер, слой контроллеров, файловый ORM с миграциями, макеты и партиалы.

prism
TL;DR

Веб-фреймворк на Ruby, построенный исключительно на стандартной библиотеке. Никаких внешних гемов: собственный роутер, слой контроллеров, файловая ORM с миграциями, макеты и партиалы. Все то, что вы обычно берете из Rails, написано с нуля, чтобы понять, как это работает на самом деле.

Введение

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

Результат - маленький фреймворк, который реально обслуживает приложение, и одновременно карта того, что конкуренты делают за занавесом. Это не макет фреймворка, а работающее целое, в котором каждый слой под рукой, потому что вы написали его собственными руками.

Роутер, который сам распутывает путь

Сердце любого веб-фреймворка - это решение о том, какой код обработает данный запрос. В prism это решение явное: вы объявляете маршруты, а роутер сопоставляет метод и путь с парой контроллер плюс действие, попутно вытаскивая параметры из сегментов адреса. Здесь нет магии, есть таблица правил, читаемая сверху вниз.

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

routes.rb · ruby
Prism::Router.draw do
  get "/posts", to: "posts#index"
  get "/posts/:id", to: "posts#show"
  post "/posts", to: "posts#create"
end

Слои данных и представления без скрытого клея

Вместо того чтобы подключать Postgres, prism держит данные в файлах и добавляет к этому миграции плюс простые запросы. Этого достаточно, чтобы показать весь цикл: вы определяете модель, выполняете миграцию, сохраняете запись и читаете ее обратно в контроллере. База данных уходит из поля зрения, а сверху остается сама форма того, как ORM отображает записи на объекты.

Ограничение файлами - не недостаток, а решение. Благодаря ему слой данных целиком помещается в голове и не прячет ни одного шага за драйвером базы, которого все равно не видно.

Рендеринг представления кажется тривиальным, пока не попробуете собрать его из слоев. У prism есть макеты, в которые впрыскивается содержимое действия, и партиалы, которые собирают повторяющиеся куски. Ровно тот же механизм, который в больших фреймворках происходит незаметно, здесь - явная функция, которую вы написали сами.

➜
Совет

Когда все написано вручную, отладка означает чтение собственного кода, а не угадывание того, что делает фреймворк. Это главная выгода такого упражнения: слой, поведение которого приходилось додумывать, просто исчезает.

Карта того, что Rails прячет за занавесом

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

Откуда обычно и откуда в prism

ЭлементОбычно с полкиВ prism
МаршрутизацияRailsсобственный роутер с нуля
Слой данныхActiveRecordфайловая ORM с миграциями
ПредставленияActionViewмакеты и партиалы вручную
Зависимостидесятки гемовноль, только stdlib

Больше проектов

Другие работы из той же категории - посмотрите, как мы решаем похожие задачи.

Есть похожий проект?

Напишите нам - смета бесплатна и приходит в течение часа.