首页
/ Ruby on Rails 框架全景:从 MVC 三层架构到全栈组件与快速上手

Ruby on Rails 框架全景:从 MVC 三层架构到全栈组件与快速上手

2026-09-07 14:30:11作者:董灵辛Dennis

导读

Rails(Ruby on Rails)是一个内置了构建"数据库驱动型 Web 应用"所需一切能力的全栈 Web 应用框架,其核心设计思想是把应用按照 Model-View-Controller(MVC) 模式划分成模型、视图、控制器三个职责清晰的层次。本文以仓库中 railties/RDOC_MAIN.md 为骨架,结合 rails 各组件源码目录,系统讲解 MVC 每层在 Rails 中对应的组件实现(Active Record、Active Model、Action View、Action Controller、Action Dispatch),介绍 Action Mailer、Active Job、Action Cable 等全栈附加组件,并给出从安装、生成项目到启动服务器的完整实操流程。读完你可以掌握 Rails 的整体技术版图、各组件在 MVC 中的定位,以及如何用命令行在 5 分钟内跑起第一个 Rails 应用。

什么是 Rails:一个完整的 MVC Web 框架

Rails 是一个 Web 应用框架,它包含创建数据库支撑(database-backed)的 Web 应用所需的全部组件。它遵循经典的 Model-View-Controller(MVC) 模式,将应用拆分为三个层次,每一层承担独立的职责:

  • Model(模型)层:代表领域模型(如 Account、Product、Person、Post 等),封装与业务领域相关的逻辑;
  • View(视图)层:负责把资源渲染成合适的表示形式(通常是 HTML);
  • Controller(控制器)层:处理传入的 HTTP 请求并返回合适的响应。

理解 MVC 是理解 Rails 的关键——MVC 通过关注点分离让业务逻辑、数据访问与界面呈现互不耦合,这一分层思想也直接决定了 Rails 仓库中各个 gem 的组织方式。

Model 模型层:Active Record 与 Active Model

Active Record:数据库表与对象的映射

在 Rails 中,数据库支撑的模型类都继承自 ActiveRecord::BaseActive Record 允许你把数据库行当作对象来使用,并在此基础上附加业务逻辑方法。例如定义:

class Product < ActiveRecord::Base
end

Product 类会被自动映射到名为 products 的数据表,并自动得到 Product#nameProduct#name= 这样的属性读写访问器。Active Record 是 Martin Fowler 所描述的 Active Record 模式的一种实现——"一个包装了数据库表或视图中某一行的对象,封装了数据库访问,并在该数据上附加领域逻辑"。

activerecord/README.rdoc 可以看到它的主要特性覆盖:类与表、属性与列的自动映射,通过 has_many / has_one / belongs_to 等类方法定义关联,基于命名约定(而非 XML 配置)推断表名与外键列名,即著名的 Convention over Configuration(约定优于配置) 哲学。仓库 activerecord/lib/active_record 下即包含 ORM 核心实现、关联、校验、迁移(active_record/migration)、事务等模块,其最底层的哲学强调两点:"不用 XML 文件,依赖反射与运行时扩展"以及"承认数据库的地位——允许为特殊情况与性能直接落到 SQL,不试图复制或取代数据定义"。

Active Model:无数据库的模型接口

并非所有 Rails 模型都必须由数据库支撑。模型也可以是普通 Ruby 类,或实现了 Active Model 模块所提供的一系列接口的 Ruby 类——例如需要校验、命名、序列化等能力的非持久化模型,都可以通过引入 Active Model 的 API 获得与 Active Record 模型一致的体验。仓库 activemodel/lib/active_model 中包含了 validationsdirtyserializationconversionnamingcallbacks 等模块目录,正是这些"接口"的具体实现。

View 视图层:Action View 与模板

View 层由"模板(templates)"组成,负责为应用的资源提供合适的表示。模板可以有多种格式,但绝大多数视图模板是内嵌 Ruby 代码的 HTML,即 ERB(.erb)文件。视图通常被渲染用于生成控制器的响应,或者用于生成电子邮件的正文。

在 Rails 中,视图的生成由 Action View 处理。仓库目录 actionview/lib/action_view 下的源码(如模板渲染、Helpers 等)即是该层的实现。典型的 ERB 模板形如:

<h1><%= @product.name %></h1>
<p><%= @product.description %></p>

<% %> 内嵌 Ruby 逻辑,<%= %> 输出表达式结果。Rails 视图系统还支持布局(layout)、局部模板(partial)、表单构建器以及丰富的视图 Helper,这些都可在 actionview/test/template 的测试用例中找到对应验证。

Controller 控制器层:Action Pack(Action Dispatch + Action Controller)

Controller 层负责处理传入的 HTTP 请求并提供合适的响应。通常这意味着返回 HTML,但 Rails 控制器也可以生成 XML、JSON、PDF、移动端专属视图等。控制器负责加载并操作模型、渲染视图模板,从而生成正确的 HTTP 响应。

在 Rails 中,传入请求由 Action Dispatch 路由到合适的控制器,而控制器类则继承自 ActionController::Base。Action Dispatch 与 Action Controller 被捆绑在同一个 Action Pack 中,二者在仓库中对应目录 actionpack/lib/action_dispatchactionpack/lib/action_controller

  • Action Dispatch:解析关于 Web 请求的信息,按用户定义完成路由,并做与 HTTP 相关的高级处理,例如 MIME 类型协商、解码 POST/PATCH/PUT 请求体中的参数、处理 HTTP 缓存逻辑、Cookie 与会话。请求最终由 actionpack/lib/action_dispatch/routing 下的路由系统(基于 Journey,见 actionpack/lib/action_dispatch/journey)映射到控制器 action。
  • Action Controller:提供一个可被继承的控制器基类,用于实现过滤器(filters)与 action 来处理请求。action 的结果通常是从视图生成的响应内容。例如:
class ProductsController < ActionController::Base
  def index
    @products = Product.all
    render :index   # 渲染 app/views/products/index.html.erb
  end
end

在使用 Rails 框架时,用户通常只直接与 Action Controller 打交道:Action Dispatch 的功能默认被启用,Action View 的渲染由 Action Controller 隐式触发。值得强调的是,这些模块被设计成可以独立运行,因此也可以脱离 Rails 单独使用。

全栈附加组件:Rails 自带的框架与库家族

除了构成 MVC 核心的 Active Record、Active Model、Action Pack、Action View 可以各自独立于 Rails 使用之外,Rails 还随附下列组件(源码目录与上一小节的 MVC 组件一起构成整个 Rails 单体仓库):

组件 仓库位置 职责
Action Mailer actionmailer/README.rdoc 生成并发送电子邮件(视图渲染同时用于生成邮件正文的场景)
Action Mailbox actionmailbox/README.md 在 Rails 应用内部接收电子邮件(支持多种入口)
Active Job activejob/README.md 声明任务(jobs)并在多种队列后端上运行它们的框架
Action Cable actioncable/README.md 将 WebSockets 与 Rails 应用集成的框架(实时推送)
Active Storage activestorage/README.md 把云存储与本地文件附加(attachment)到 Rails 应用的库
Action Text actiontext/README.md 处理富文本内容的库(基于 Trix 编辑器)
Active Support activesupport/README.rdoc Rails 常用工具类与标准库扩展的集合,也可独立于 Rails 使用

例如 Active Job 通过统一的任务接口抽象出 perform 方法,让同一份任务代码可以在不同的队列后端上运行(可参考 activejob/test/adapters 下的多种后端测试);Action Cable 在 actioncable/lib/action_cable 中实现连接、通道、订阅适配器等 WebSocket 服务端能力;Action Text 依赖 Active Storage 存储富文本附件。把这些组件拼合起来,Rails 就构成了一个覆盖 HTTP 处理、邮件收发、异步任务、实时通信、文件存储与富文本的"全栈"解决方案。

由源码理解 Rails 的整体装配:Railties 的角色

本系列文档的归属地 railties/RDOC_MAIN.md 被列入 railties gem 的文件清单(见 railties/railties.gemspec),它是 railties 包的 RDoc 主入口文档。而 Railties 正是负责把上述所有框架"粘合"在一起的组件,如 railties/README.rdoc 所述,它整体承担三件事:

  1. 引导(bootstrap) 一个 Rails 应用——对应 railties/lib/rails/application.rbrailties/lib/rails/initializable.rb 等应用初始化机制;
  2. 管理 rails 命令行接口(CLI)——rails 可执行文件入口位于 railties/exe/rails,其核心逻辑调用 require "rails/cli"railties/lib/rails/cli.rb 中,Rails::AppLoader.exec_app 会先判断是否已在某个 Rails 应用目录内,若是则 exec 出应用的 bin/rails,否则根据首个参数分发到 gem 帮助、pluginapplication(即 rails new)命令;
  3. 提供 Rails 生成器核心(generators core)——实现位于 railties/lib/rails/generatorsrailties/lib/rails/commands

从依赖角度看,railties/railties.gemspec 声明了对 activesupportactionpack 的运行时依赖,以及对 rackuprakethor(命令行解析)、zeitwerk(自动加载)等基础设施的依赖;同时 rails.gemspec(仓库根目录)会把全部组件打包进 rails 这个完整框架的 gem 中。本文所述 railties/RDOC_MAIN.md 实质上就是面向最终用户的"Rails 是什么"总览文档。当前仓库版本为 8.2.0.alpha(见 RAILS_VERSION)。

快速上手:安装、生成项目并启动服务器

以下是 RDOC_MAIN 给出的从零开始体验 Rails 的标准路径(适用于已安装 Ruby 的环境):

1. 安装 Rails(如果还没安装):

$ gem install rails

2. 创建新应用myapp 即应用名:

$ rails new myapp

3. 进入应用目录并启动 Web 服务器

$ cd myapp
$ bin/rails server

bin/rails server 还可通过 --help-h 查看可选参数(例如绑定地址、端口、运行环境等),这些选项由 railties/lib/rails/commands 中的命令实现解析并转发给底层 Rack 服务器。

4. 打开 http://localhost:3000,你会看到显示当前 Rails 与 Ruby 版本的 Rails 欢迎页(bootscreen,对应 railties 中内置的 welcome_controller.rbhealth_controller.rb 等内置端点)。

5. 开始开发你的应用。创建好应用骨架后,后续开发通常沿着这样一条主链路进行:用生成器创建模型(自动生成 Active Record 迁移)→ 编写控制器 action → 编写 ERB 视图 → 用 bin/rails server 运行调试。仓库中各组件目录下的 README(如 activerecord/README.rdocactionpack/README.rdoc)是进一步深挖每一层的入口,而 bin/rails generatebin/rails db:migrate 等日常命令则全部由 Railties 的命令系统提供。

生态与协作约定

Rails 是一个开放协作的开源项目。本仓库鼓励开发者参与贡献,同时明确了安全上报与社区行为要求:若发现可能的安全漏洞,应遵循项目安全策略私下上报;所有在本仓库及其子项目代码库、Issue 跟踪器、聊天室与邮件列表中互动的参与者,都被期望遵守社区行为准则。Ruby on Rails 以 MIT 许可证 发布(各子项目目录中均随附 MIT-LICENSE 文本),这意味着你可以自由地将其用于商业与个人项目。

小结

从架构视角看,Rails 通过 MVC 把请求处理清晰地划分为三层:Active Record 与 Active Model 构成模型层的数据与业务逻辑载体,Action View 负责模板化输出,Action Controller 与 Action Dispatch(合称 Action Pack)承担路由与请求/响应的编排;在此基础上,Action Mailer、Action Mailbox、Active Job、Action Cable、Active Storage、Action Text 与 Active Support 补齐了邮件、异步任务、WebSocket、文件与富文本等 Web 应用的高频需求;最后,Railties 把这些组件装配起来,并提供 rails CLI、应用引导与生成器。理解这张全景图,是使用好每一层 API、定位问题时快速找到对应源码目录的前提。

登录后查看全文
热门项目推荐
相关项目推荐