Skip to main content

moon

 · 

Ruby (Rails) 中间件原理与流程简介

Ruby 中间件(Middleware)基于 Rack 规范,是 Rails 处理 HTTP 请求的“链式管道”。每个中间件是一个类,实现了 call(env) 方法。

原理

Ruby 中间件(Middleware)基于 Rack 规范,是 Rails 处理 HTTP 请求的“链式管道”。每个中间件是一个类,实现了 call(env) 方法:

  • 输入:env(Rack 环境哈希,包括 URL、headers、params)。
  • 输出:[status, headers, body](HTTP 状态、头、响应体)。
  • 核心思想:像洋葱层,中间件可修改请求/响应(如日志、认证、静态文件),不耦合核心应用。
  • Rails 集成:config.middleware 栈管理顺序,先添加的先执行(外层)。

执行流程

  1. 请求进入:浏览器发送请求 → Rack 入口 → 外层中间件 call(env)。
  2. 链式调用:每个中间件调用下一个(@app.call(env)),向内执行(外到内)。
  3. 核心处理:到达 Rails 应用 → 控制器执行 → 返回响应。
  4. 响应返回:逆序执行(内到外),中间件可修改响应(如添加头)。
  5. 结束:返回客户端。

流程图(简化):

请求 → 中间件1.call → 中间件2.call → ... → Rails App → ... ← 中间件2.call ← 中间件1.call → 响应

示例

# app/middleware/my_middleware.rb
class MyMiddleware
def initialize(app)
@app = app # 下一个中间件
end

def call(env)
# 请求前处理
Rails.logger.info "Request: #{env['REQUEST_URI']}"
status, headers, body = @app.call(env) # 调用下一个
# 响应后处理
headers['X-Custom'] = 'Value'
[status, headers, body]
end
end
# config/application.rb
config.middleware.use MyMiddleware # 添加到栈

优点:模块化、可复用;缺点:调试复杂(用 config.middleware.insert_before/after 控制顺序)。

参考:Rails Guides - Rack Middleware。

Download Pickful App

Better experience on mobile

iOS

Android

APK