Ruby Rails:MVC 架构与控制器
1. 定位控制器在 MVC 中的核心作用
- 理解 MVC 分层逻辑。模型
Model负责对接数据库与业务规则,视图View负责向用户展示 HTML 页面,控制器Controller充当中间指挥员,负责接收用户请求、调用模型处理数据,并将结果交给视图渲染。 - 区分 传统 Web 请求路径与 Rails 路由的对应关系。浏览器输入网址后,Rails 的
config/routes.rb文件作为“交通指挥所”,会将请求精准分发给对应的控制器动作。 - 确认 控制器文件存放位置。所有控制器默认存放在
app/controllers/目录下,文件名与类名必须严格遵循驼峰命名法转下划线规则。
graph LR
A["用户浏览器请求"] --> B["config/routes.rb 路由匹配"]
B --> C["控制器解析参数"]
C --> D["调用 Model 读写数据库"]
D --> C
C --> E["实例变量传递至 View"]
E --> F["生成 HTML 响应给用户"]
2. 生成并配置基础控制器
- 打开 终端并进入 Rails 项目根目录。
- 执行 脚手架辅助命令。输入
bin/rails generate controller Articles index show new,系统将自动创建控制器文件、对应的视图目录结构以及路由占位代码。 - 定位 生成的主逻辑文件。打开
app/controllers/articles_controller.rb,文件内将自动生成继承自ApplicationController的类以及index、show、new三个空方法体。 - 编写 路由映射规则。打开
config/routes.rb,在Rails.application.routes.draw do ... end代码块内输入resources :articles。该指令会自动建立标准 RESTful 路由表,包含增删改查的全部网络路径。
以下为 resources :articles 自动生成的路由对照说明,用于明确请求流向与动作对应:
| HTTP 动词 | URL 路径 | 对应控制器方法 | 核心作用 |
|---|---|---|---|
GET |
/articles |
index |
获取 列表数据并展示 |
GET |
/articles/new |
new |
打开 新建表单页面 |
POST |
/articles |
create |
提交 数据并创建记录 |
GET |
/articles/1 |
show |
查看 单条详情 |
GET |
/articles/1/edit |
edit |
打开 编辑表单页面 |
PATCH/PUT |
/articles/1 |
update |
更新 已有记录 |
DELETE |
/articles/1 |
destroy |
删除 指定记录 |
3. 处理请求与提取参数
- 定义 强参数白名单。在
ArticlesController类内部新增article_params私有方法,写入params.require(:article).permit(:title, :content)。此操作拦截非授权字段,防止外部恶意篡改数据库结构。 - 调用 参数实例化数据。在
create方法中输入@article = Article.new(article_params)。该代码将前端传入的合法参数直接注入模型实例,跳过手动逐一赋值的繁琐步骤。 - 执行 数据库持久化操作。接续上一步代码,添加
if @article.save条件判断。save方法触发写入流程,并根据模型内置校验规则返回布尔值。 - 重定向 操作完成页面。在
save成功分支内写入redirect_to @article, notice: "创建成功"。此指令会向浏览器发送 HTTP 状态码302,强制刷新至详情页,有效避免用户刷新页面导致重复提交表单。
4. 控制响应与视图渲染
- 传递 实例变量至视图。在控制器动作中赋值带有
@符号的变量,例如@articles = Article.all.order(created_at: :desc)。Rails 框架会自动将带@的实例变量暴露给同名视图文件,普通局部变量无法跨层传递。 - 覆盖 默认渲染行为。若需根据业务逻辑返回非标准页面,替换默认响应代码为
render :custom_page或render json: { status: "ok" }。前者返回自定义 ERB 模板,后者返回纯 JSON 数据流供前端接口调用。 - 处理 渲染失败分支。在数据校验失败的
else分支中使用render :new。该操作不会触发新的 HTTP 请求,而是直接在当前服务器内存中复用模板,保留用户已输入的表单数据与错误提示信息。
5. 使用过滤器管理生命周期
- 添加 全局前置校验。在控制器类顶部声明
before_action :authenticate_user!。该钩子会在执行任何公开动作前拦截请求,优先运行指定方法,常用于用户登录状态或权限检查。 - 限定 过滤器作用范围。为
before_action追加条件参数except: [:show, :index]或only: [:edit, :destroy]。此设置缩小拦截面,确保公开页面无需验证权限,提升系统整体响应效率。 - 终止 请求链条。在过滤器方法内部调用
redirect_to root_path并紧跟return语句。此组合操作将立即中断后续所有控制器动作的执行,直接返回指定页面,防止未授权逻辑穿透执行。 - 挂载 后置处理逻辑。在需要记录日志或清理临时文件的场景,声明
after_action :log_request_time。该方法将在视图渲染完成后触发,确保核心业务运行不被阻塞,同时完成辅助任务。

暂无评论,快来抢沙发吧!