0Pricing
Ruby Academy · 课时

控制器与操作

处理请求

控制器与操作 是 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 反馈 — 无需本地设置。

此课程中的所有课时

  1. 路由与资源
  2. 控制器与操作
  3. 强参数
  4. 视图与渲染
← 返回 Ruby Academy