控制器与操作
处理请求
控制器与操作 是 CoddyKit 上的免费 Ruby Academy 课时。 这是第 2 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Ruby Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Ruby Academy 课程共包含 4 节课。
什么是控制器
控制器接收路由器发来的请求,执行相应工作,并决定要返回的内容。它负责协调模型和视图。
- 控制器位于
app/controllers。 - 控制器继承自
ApplicationController。 - 每个公开方法都是一个操作。
定义控制器
控制器是以 Controller 结尾的类。按照约定,ArticlesController 会处理 articles 资源的路由。
class ArticlesController < ApplicationController
def index
@articles = Article.all
end
end操作与路由对应
七条 REST 路由中的每一条都会调用相应的操作。路由器会将 GET /articles 发送到 index,将 GET /articles/1 发送到 show,其他路由也遵循同样的规则。按照约定为操作命名,可以让所有内容自动连接起来。
参数哈希
请求数据会通过 params 传入。这是一个类似哈希的对象,其中包含路由片段、查询字符串和表单字段。对于 /articles/5,params[:id] 的值是 "5"。
def show
@article = Article.find(params[:id])
end将实例变量传递给视图
控制器通过实例变量(以 @ 为前缀)向视图传递数据。在操作中设置的任何 @variable 都可以在对应的视图模板中使用。
def index
@articles = Article.all
# @articles is available in index.html.erb
end实现索引与 show
读取操作很简单:index 加载一个集合,show 根据 id 加载一条记录。随后,它们会渲染各自的默认模板。
class ArticlesController < ApplicationController
def index
@articles = Article.all
end
def show
@article = Article.find(params[:id])
end
end实现 create
create 操作会根据提交的数据构建一条记录并保存。成功后会重定向;失败后会重新渲染表单,以便用户修正错误。
def create
@article = Article.new(article_params)
if @article.save
redirect_to @article
else
render :new, status: :unprocessable_entity
end
end重定向与渲染
这是两种截然不同的响应:
redirect_to会告诉浏览器向另一个 URL 发起新请求。render会直接为当前请求返回一个视图。
写入成功后应进行重定向;需要再次显示带有错误信息的表单时应进行渲染。
操作前处理
before_action 会在选定的操作运行前执行共享的初始化工作,从而减少重复代码。一个常见用途是加载 show、edit、update 和 destroy 所需的记录。
class ArticlesController < ApplicationController
before_action :set_article, only: [:show, :edit, :update, :destroy]
private
def set_article
@article = Article.find(params[:id])
end
end过滤器与身份验证
before_action 也可以强制执行规则。像 before_action :require_login 这样的保护措施可以执行 redirect_to login_path,并在用户未登录时停止操作,从而一次保护整个控制器。
before_action :require_login
private
def require_login
redirect_to login_path unless current_user
end处理缺失的记录
当 find 找不到记录时,会引发 RecordNotFound,Rails 会在生产环境中将其转换为 404。您可以使用 rescue_from 自定义此行为,以显示友好的页面。
rescue_from ActiveRecord::RecordNotFound do
redirect_to articles_path, alert: "Not found"
end快速检查
请测试您对控制器的理解。
回顾:控制器与操作
您已经学会了控制器如何处理请求:
- 按照约定,操作会映射到路由。
params携带请求数据;@variables会将数据传递给视图。create会保存数据,然后进行重定向或重新渲染。redirect_to和render用于不同的目的。before_action可以共享初始化工作并强制执行身份验证。
接下来,您将使用强参数确保批量赋值安全。
常见问题解答
「控制器与操作」课时是免费的吗?
是的 — 「控制器与操作」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Ruby Academy 课程的其余内容,请升级到 CoddyKit PRO。 Ruby Academy 课程共包含 4 节课。
「控制器与操作」这节课中我会学到什么?
处理请求 你通过在浏览器中直接运行的动手代码来练习 Ruby Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Ruby Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Ruby Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 4 节。
「控制器与操作」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Ruby Academy 课中编写并运行代码吗?
能。每节 Ruby Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。