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.ruRails::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 middlewaremodule 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
