Зарегистрируйтесь для доступа к 15+ бесплатным курсам по программированию с тренажером

Middlewares Основы разработки на Ruby on Rails

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

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

Rack и Rails

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

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

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

rackup --help

# Запуск Rack с указанием пути до файла конфигурации
rackup config.ru
Rails::Server.new.tap do |server|
  require APP_PATH
  Dir.chdir(Rails.application.root)
  server.start
end

class RailsServer < ::Rack::Server
  def initialize
    # ...
    super
  end

  def start
    # ...
    super
  end
end

Управление middlewares

# Список миддлвар
# https://guides.rubyonrails.org/rails_on_rack.html#internal-middleware-stack
bin/rails middleware
module MiddlewareApp
  class Application < Rails::Application
    config.load_defaults 6.1

  # Удаление миддлвары из списка
    config.middleware.delete ActionDispatch::Session::CookieStore
    # Поменять мидлвары местами
    config.middleware.swap ActionDispatch::Flash, ActionDispatch::Cookies
    # Вставка миддлвары в определенном порядке
    config.middleware.insert_before ActionDispatch::Flash, ActionDispatch::Cookies
    config.middleware.insert_after ActionDispatch::Flash, ActionDispatch::Cookies
    # Добавить миддлвар в конец
    config.middleware.use ActionDispatch::Flash

    # В миддлвары можно передавать аргументы. Они будут 2, 3 и тд параметрами
    config.middleware.use RequestTimeLogger, '#'
  end
end

Собственные 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
# lib/request_time_logger.rb
class FreezeServer
  attr_reader :app
  def initialize(app)
    @app = app
  end

  def call(env)
    @status, @headers, @response = @app.call(env)

    # Лучше в миддлваре не использовать тяжелую логику
    sleep 2
    [@status, @headers, @response]
  end
end
# config/environments/development.rb
require "active_support/core_ext/integer/time"
require_relative '../../lib/request_time_logger'
require_relative '../../lib/freeze_server'

Rails.application.configure do
  config.middleware.use RequestTimeLogger, '#'
  config.middleware.use FreezeServer
  #...
end

Аватары экспертов Хекслета

Остались вопросы? Задайте их в разделе «Обсуждение»

Вам ответят команда поддержки Хекслета или другие студенты.

Для полного доступа к курсу нужен базовый план

Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.

Получить доступ
1000
упражнений
2000+
часов теории
3200
тестов

Открыть доступ

Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно

  • 130 курсов, 2000+ часов теории
  • 1000 практических заданий в браузере
  • 360 000 студентов
Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и условия «Оферты», а также соглашаетесь с «Условиями использования»

Наши выпускники работают в компаниях:

Логотип компании Альфа Банк
Логотип компании Aviasales
Логотип компании Yandex
Логотип компании Tinkoff
Рекомендуемые программы

С нуля до разработчика. Возвращаем деньги, если не удалось найти работу.

Иконка программы Разработчик на Ruby on Rails
Профессия
c опытом
Создание веб-приложений со скоростью света
2 февраля 5 месяцев

Используйте Хекслет по-максимуму!

  • Задавайте вопросы по уроку
  • Проверяйте знания в квизах
  • Проходите практику прямо в браузере
  • Отслеживайте свой прогресс

Зарегистрируйтесь или войдите в свой аккаунт

Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и условия «Оферты», а также соглашаетесь с «Условиями использования»
Изображение Тото

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