HTML Diff
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 # =&gt; {:key=&gt;"value"} # pp hash2 # =&gt; {:key=&gt;"value", :key2=&gt;"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 &lt; ::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 &lt; 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 # =&gt; {:key=&gt;"value"} # pp hash2 # =&gt; {:key=&gt;"value", :key2=&gt;"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