> For the complete documentation index, see [llms.txt](https://interlink.gitbook.io/process/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://interlink.gitbook.io/process/dev/development/technologies/programming-languages/ruby.md).

# Ruby

**Темы для изучения** \
\
**Ruby**

* Reflection/Metaprogramming
* Mixins
* Operator overloading
* Разработка [custom DSL](https://www.leighhalliday.com/creating-ruby-dsl)
* [Concurency](https://www.honeybadger.io/blog/ruby-concurrency-parallelism/)

**Rails**

* ActiveModel
* Modules
* REST API
* Devise
* I18n

**Patterns**

* Presenter
* Interactor-rails&#x20;
* Aasm (acts-as-state-machine)

**Background Processing, Worker and Queue**&#x20;

* sidekiq&#x20;
* delayed\_job\_recurring&#x20;
* iron\_worker\_ruby

**Tests**&#x20;

* rspec-rails&#x20;
* webmock&#x20;
* factory\_bot&#x20;
* capybara&#x20;
* poltergeist&#x20;
* selenium-webdriver

**Monitoring, Logging, Debugging, Tracking**&#x20;

* scout\_apm\_ruby&#x20;
* newrelic\_rpm&#x20;
* rollbar&#x20;
* mixpanel&#x20;
* foreman (process manager for applications with multiple components)&#x20;
* byebug&#x20;
* impressionist

**Security Vulnerability**&#x20;

* brakeman

**Emails**&#x20;

* mailgun&#x20;
* sendgrid

**Запуск в продакшен**

* Puma
* Passenger
* Unicorn

Таблица проверки качества кода для Ruby-on-Rails:

* Каждое действие в контроллере вызывает только один метод модели, за исключением начального find или new.  &#x20;(Все остальные необходимые вызовы .new или .update делаются в модели).
* Не более двух экземпляров переменных передаются между каждым контроллером и видом.
* Все имена моделей и переменных моментально понятны (новым разработчикам) и сокращены насколько возможно без использования аббревиатур.
* Все специальные «find», доступные более чем из одного места, в коде используют name\_scope вместо отдельных методов.
* Методы .find и .find\_by\_ никогда не вызываются из вида или помощника (view helper).
* Полное отсутствие своего кода, дублирующего встроенную функциональность Rails.
* Код должен быть интенсивно выдраен (DRYed) в процессе разработки (избавлен от повторов).
* Любой функционал, используемый в двух и более моделях, вынесен в библиотеку/модуль.
* Вся логика, дублирующаяся в разных приложениях, помещается в подключаемый gem.
* STI не используется нигде. Вообще.
* Каждое проектное решение порождает минимально-необходимую для удовлетворения текущих нужд пользователей архитектуру.
* В приложение не закладывается предполагаемая будущая функциональность.
* Практически полное покрытие приложения высокоуровневыми тестами: для действий внутри и между контроллерами.
* Покрытие тем выше, чем больше конечных пользователей у кода.
* Все тесты проходят перед включением кода в общий репозиторий.
* Каждое исправление ошибок внедренного продукта имеет тесты для исключения регрессии.
* Код каждого расширения (plugin) просматривается.

**Дополнительные источники**

* [Tom Stuart - Refactoring Ruby with Monads](https://www.youtube.com/watch?v=J1jYlPtkrqQ)
* [Streaming Large ZIP Files in Rails](https://piotrmurach.com/articles/streaming-large-zip-files-in-rails/)
* [Эффективные модели ActiveRecord](https://www.youtube.com/watch?v=Gi5ogoPY73o)
* [Ruby on Rails security best practices](https://hixonrails.com/ruby-on-rails-tutorials/ruby-on-rails-security-best-practices/)
