Ruby On Rails

Теория: Middlewares

Программа урока

  • Rack и Rails
  • Промежуточные программы (middlewares) в Rails
  • Популярные middlewares
  • Пишем собственную middleware для Rails

Rack и Rails

# Инстанс Rails приложения
Rails.application

# Корневая директория приложения
Rails.application.root

# Запуск rack сервера
# Смотрит на конфиг config.ru
rackup

rackup --help

# Запуск Rack с указанием пути до файла конфигурации
rackup config.ru

Управление middlewares

# Список миддлвар
# https://guides.rubyonrails.org/rails_on_rack.html#internal-middleware-stack
bin/rails middleware

Собственные middlewares

# lib/request_time_logger.rb
class RequestTimeLogger
  attr_reader :app, :logger_indentificator

  def initialize(app, logger_indentificator = '*')
    @app = app
    @logger_indentificator = logger_indentificator
  end

  def call(env)
    dup._call(env)
    # Метод dup клонирует начальный объект
    # hash1 = {key: 'value', key2: 'value2'}
    # hash2 = hash1.dup
    # hash1.delete :key2
    # pp hash1 # => {:key=>"value"}
    # pp hash2 # => {:key=>"value", :key2=>"value2"}
  end

  def _call(env)
    request_recieved_at = Time.now
    @status, @headers, @response = @app.call(env)
    request_handled_at = Time.now

    beauty_logging(request_handled_at - request_recieved_at)

    [@status, @headers, @response]
  end

  private

  def beauty_logging(time)
    Rails.logger.debug(logger_indentificator * 50)
    Rails.logger.debug("Request time: #{time}")
    Rails.logger.debug(logger_indentificator * 50)
  end
end