# Инстанс 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
# Список миддлвар
# 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
# 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
Вам ответят команда поддержки Хекслета или другие студенты.
Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.
Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно
Наши выпускники работают в компаниях:
С нуля до разработчика. Возвращаем деньги, если не удалось найти работу.
Зарегистрируйтесь или войдите в свой аккаунт
Задавайте вопросы, если хотите обсудить теорию или упражнения. Команда поддержки Хекслета и опытные участники сообщества помогут найти ответы и решить задачу