1 added
9 removed
Original
2026-01-01
Modified
2026-02-26
1
-
<h2>Программа урока</h2>
1
+
# 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
2
-
<ul><li>Rack и Rails</li>
3
-
<li>Промежуточные программы (middlewares) в Rails</li>
4
-
<li>Популярные middlewares</li>
5
-
<li>Пишем собственную middleware для Rails</li>
6
-
</ul><h3>Rack и Rails</h3>
7
-
# Инстанс Rails приложения Rails.application # Корневая директория приложения Rails.application.root # Запуск rack сервера # Смотрит на конфиг config.ru rackup 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<h3>Управление middlewares</h3>
8
-
# Список миддлвар # 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<h3>Собственные middlewares</h3>
9
-
# 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