Rails под капотом. Базовые компоненты. ч. 1

Следующие несколько статей будут посвящены описанию гемов, которые устанавливаются как зависимости rails. Перечисление будет по порядку, как они идут в списке bundler. Поехали!!!

Rake - что это такое и зачем он нужен?

Очень простыми словами: Rake это вспомогательный инструмент для ruby проектов. Он предоставляет DSL для написания задач на ruby, которые можно запускать из командной строки

Сложнее: Rake это Ruby Make, отдельная утилита которая заменяет UNIX утилиту ‘make’. Он использует Rakefile и файлы с расширением .rake. Rails используют rake для административных задач. Если ввести в консоли rake --tasks то мы получим набор команд для работы с ассетами, кешем, базой данных и т.д. Также мы можем создавать свои задачи. Программисты обычно используют их либо для оптимизации своих действий, либо для изменения и какой-то обработки данных на сервере.

i18n - мультиязычность и интернационализация

Этот гем позволяет легко разрабатывать ваш интерфейс сразу на нескольких языках. Именно он добавляет хелпер t() который позволяет через псевдоним получить фразу на искомом языке. Сами же псевдонимы и фразы удобно оргиназуются с помощью YAML файлов.

json - упаковка данных в JSON и обратно

Гем используется для преобразования данных в json и обратно. Если я не ошибаюсь, он написан на ruby и используется в большинстве случаях. Но, если преобразование в json является вашей проблемой в производительности - можно использовать более быстрый gem oj. Опять же, если я не ошибаюсь, он написан на C и работает очень быстро.

minitest - стандартный компонент rails для тестирования.

Представляет собой DSL для написания тестов. Но, для тестов все же лучше использовать какой-нибудь более мощный инструмент, например RSpec, который с 3ей версии стал намного лучше.

thread_safe - потока-безопасная реализация нескольких ruby объектов.

Гем предоставляет потока-безопасную реализацию массива и хеша.

 
require 'thread_safe'

sa = ThreadSafe::Array.new # supports standard Array.new forms
sh = ThreadSafe::Hash.new # supports standard Hash.new forms
cache = ThreadSafe::Cache.new

Cache - более быстрая реализация ThreadSafe::Hash однако не полностью совместимая с ruby Hash

tzinfo - работа с датами в нескольких временных зонах и преобразование их к одной

activesupport - расширяем руби

“Rails is the killer app for Ruby.”– Yukihiro Matsumoto, Creator of Ruby

Руби создавался чтобы быть удобным в первую очередь программисту. И эти самые программисты постоянно работают над тем, чтобы расширить базовые классы руби. Собственно именно это и делает gem activesupport - расширяет ruby, чтобы сделать его еще более удобным. Concerns как более прокаченные модули, HashWithIndifferentAccess, метода строки такие как pluralize, humanize и т.д. Очень огромное количество методов, которые добавляются сразу в несколько классов, например

 
{c: 3, b: 2, a: 1}.to_query # => "a=1&b=2&c=3"

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

builder - генерация XML erubis - быстрая имплементация eRuby

Если честно, я так и не понял до конца, что это и зачем оно в рельсах, но судя по всему это какой-то шаблонный движок для вьюх, например как erb

mini_portile - портирование библиотек для отладки

Эта утилита нужна для мейнтейнеров rails. Разработчик не может себе позволить заявить “Это все работает у меня, а что там у вас разбирайтесь сами” mini_portile поможет легко, и главное временно, установить другие версии библиотек


require "mini_portile"
recipe = MiniPortile.new("libiconv", "1.13.1")
recipe.files = ["http://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.13.1.tar.gz"]
recipe.cook
recipe.activate

Это пример из официальной документации, тут идет установка библиотеки libiconv версии 1.13.1

nokogiri - гем для скрейпинга веб страниц

Отличны инструмент, если вам нужно вытащить информацию из чужих веб страниц. Он разбирает структуру и позволяет искать элементы используя jQuery синтаксис. Короткий пример:


require 'nokogiri'
require 'open-uri'

doc = Nokogiri::HTML(open('http://www.nokogiri.org/tutorials/installing_nokogiri.html'))

doc.css('nav ul.menu li a').each do |link|
  puts link.content
end

rails-deprecated_sanitizer - в rails 4.2 была переписана санитизация. Этот гем для совместимости и будет удален в rails 5

rails-dom-testing - тестирование дом структуры

При интеграионном тестировании нам часто нужно проверить, есть ли какой-то определенный элемент на странице

loofah - санитизация HTML/XML кода

rails-html-sanitizer - думаю название говорит само за себя. Это та самая новая санитизация в rails 4.2

actionview - реализация буквы V из паттерна MVC

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

rack - Что такое rack простыми словами

Что такое rack очень важная тема и достойна отдельной статьи, но я попытаюсь объяснить зачем он нужен и какое место он занимает в rails

Rack - прослойка между сервером и приложением. Когда запускается один из rails серверов (unicorn, puma, thin или любой другой) - на машине на которой он запущен становится доступен какой-то порт. Веб браузер на этот порт отправляет запрос, который выглядит примерно так


GET /users HTTP/1.1
Host: localhost
Connection: close

И он ожидает ответ, который выглядит примерно так


HTTP/1.1 200 OK
Content-Length: 25
Content-Type: text/html

...


Так вот, rack переводит входящий ответ в формат, описанный в его спецификации и передает управление в приложение. Соответственно, само приложение должно быть rack совместимым.

Еще раз - Сервер отвечает за то, чтобы принять запрос. Он решает задачи оптимизации этого процесса, много-поточности, взаимодействия с NGINX и т.д. Они используют rack чтобы передать управление в rack-совместимые приложения. Приложение обработает данные полученные из rack, и вернет ответ в формате,также описанном в rack спецификации. Сервер передает этот ответ браузеру. Думаю, что это довольно интересная тема и я напишу отдельную статью.

rack-test - тестовый фреймоврк для rack приложенией

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

Комментарии