13 Rails的MVC架构之控制器的职责
在上一篇中,我们探讨了Rails MVC架构中的视图职责。视图的作用是展现数据,并提供用户与应用程序交互的界面。而在本章中,我们将重点关注控制器的职责。控制器是MVC架构中承上启下的一环,它负责处理用户的请求,协调模型与视图,确保应用程序能够顺利运行。
控制器的基本概念
在Rails中,控制器的主要任务是接收用户的请求并将请求路由到相应的模型或视图。控制器从模型获取数据,然后选择一个视图来展示这些数据。每个控制器都是 ApplicationController
的子类,Rails会根据约定的命名规则将URL请求映射到相应的控制器和动作。
控制器的基本结构
一个控制器通常包含多个“动作”,每个动作对应一个用户请求。以下是一个简单的控制器示例:
class ArticlesController < ApplicationController
def index
@articles = Article.all
end
def show
@article = Article.find(params[:id])
end
def new
@article = Article.new
end
def create
@article = Article.new(article_params)
if @article.save
redirect_to @article
else
render :new
end
end
private
def article_params
params.require(:article).permit(:title, :body)
end
end
在这个 ArticlesController
中,我们可以看到几个动作的定义:
index
:列出所有文章。show
:显示特定文章的详细信息。new
:展示一张表单以创建新文章。create
:处理表单提交,创建新文章。
控制器的职责
控制器在Rails应用程序中的主要职责包括:
-
处理请求和响应: 控制器负责从请求中获取参数,处理逻辑,并确定要渲染的视图或重定向到其他页面。
-
协调模型与视图: 控制器从模型获取数据,并将这些数据传递给视图进行展示。
-
用户输入的验证: 控制器负责接收来自用户的输入,并通过模型进行验证,确保数据的合法性和完整性。
-
应用逻辑: 控制器可以包含一些基本的应用逻辑,比如条件判断、流程控制等。
-
授权和认证: 控制器通常会涉及用户的权限和身份验证逻辑,确保用户请求的合法性。
路由与控制器的关系
在Rails中,路由(Routes)负责将HTTP请求映射到相应的控制器和动作。我们可以在 config/routes.rb
文件中定义应用程序的路由。例如:
Rails.application.routes.draw do
resources :articles
end
上述代码将自动为 ArticlesController
创建一组RESTful路由,包括 index
, show
, new
, create
, edit
, update
, 和 destroy
等动作。
案例:文章管理系统
假设我们正在构建一个简单的文章管理系统,以下是一些使用控制器的典型场景:
列出所有文章
在 index
动作中,我们将所有的文章从数据库中检索出来,并传递给视图进行渲染:
def index
@articles = Article.all
end
对应的视图 index.html.erb
可以这样写:
<h1>Articles</h1>
<% @articles.each do |article| %>
<h2><%= link_to article.title, article_path(article) %></h2>
<p><%= article.body %></p>
<% end %>
创建新文章
在 create
动作中,我们从表单中接收数据,并通过模型保存它:
def create
@article = Article.new(article_params)
if @article.save
redirect_to @article
else
render :new
end
end
这里的 article_params
方法用于强参数(Strong Parameters),确保只允许特定的参数被接受。
控制器中的过滤器
除了基本的动作,Rails还支持控制器过滤器,可以在动作执行前后跑特定的代码。例如,我们可以在控制器中使用 before_action
来进行用户身份验证:
class ArticlesController < ApplicationController
before_action :authenticate_user!
# 其他动作...
end
这里的 authenticate_user!
方法可以是一个确保用户已经登录的逻辑。
总结
控制器在Rails MVC架构中扮演着至关重要的角色,它负责处理用户请求、协调模型与视图并实现应用逻辑。在实际开发中,通过合理设计控制器,可以确保代码的可读性和可维护性。
在下一篇中,我们将讨论Rails与数据库的连接,深入探索Rails的ActiveRecord模型如何与数据库交互。敬请期待!