📅  最后修改于: 2023-12-03 15:34:45.590000             🧑  作者: Mango
Ruby on Rails 框架是一个基于 MVC(模型-视图-控制器) 的框架,其中控制器是起到链接模型(数据)和视图(用户界面)的作用。这篇文章将会介绍 Ruby on Rails 控制器的概念、如何创建和使用控制器,并且一些控制器的最佳实践。
控制器是 MVC 架构的核心之一,它充当模型和视图之间的桥梁,负责处理应用程序的逻辑。它是一个由 Ruby 类组成的集合,用于处理应用程序中的请求和响应。控制器在应用程序的请求响应周期中的作用可以简单地表示为:浏览器发出请求时,Rails 路由器将请求发送给特定的控制器,控制器会获取和处理这个请求,执行必要的操作并返回响应。
在 Rails 中,控制器是从 ActionController::Base 类中派生出来的,该类为 Rails 提供了许多常用的功能。下面是一个最基本的控制器代码示例:
class UserController < ActionController::Base
def index
@users = User.all
end
end
代码解释:
UserController
类并从 ActionController::Base
类中派生出来。index
方法是 UserController
中的一个操作,当请求该操作时,它将获取所有用户对象并将其分配给实例变量 @users
。@users
来渲染用户列表。创建并使用控制器需要经过以下步骤:
控制器通过 Rails 生成器命令创建:
rails generate controller User
会将如下文件添加到应用目录:
app/controllers/user_controller.rb
app/views/user
打开 app/controllers/user_controller.rb
文件并定义操作。例如,我们在 UserController
中定义了 index
操作。
class UserController < ApplicationController
def index
@users = User.all
end
end
在 app/views/user/
目录中创建名为 index.html.erb
的视图文件。
<h1>Users List:</h1>
<ul>
<% @users.each do |user| %>
<li><%= user.name %></li>
<% end %>
</ul>
我们需要将路由连接到刚刚创建的 UserController
上。在 config/routes.rb
文件中添加以下路由规则:
Rails.application.routes.draw do
get 'user/index'
end
现在我们可以在浏览器中访问 http://localhost:3000/user/index
来查看用户列表。
控制器本质上应该只包含与请求响应周期有关的逻辑。应避免在控制器中实现业务逻辑或其他复杂的操作。我们应该通过将业务逻辑从控制器中分离出来,将其放在模型或服务对象中来降低控制器中的代码复杂度。
class UserController < ApplicationController
def index
@users = User.all
end
def create
user = User.new(user_params)
if user.save
# do something
else
# do something else
end
end
private
def user_params
params.require(:user).permit(:name, :email, :password)
end
end
上面的代码中,我们从 create
操作中提取了创建并保存用户的逻辑放在模型中。这样做可以使控制器变得更简单、更易于测试。
过滤器可用于在控制器中定义操作执行之前或之后的处理逻辑。常用的过滤器有 before_action
和 after_action
。例如:
class UserController < ApplicationController
before_action :authenticate_user
def index
# do something
end
end
上面的 before_action
运行在 index
操作之前,并验证用户是否已通过身份验证。这使我们的程序更具可维护性和可读性。
如果您认为您的控制器有太多的实例变量流通,那么这可能意味着您正在共享状态,这是一个非常糟糕的做法。共享状态意味着您的代码是不可预测的,难以调试,并且会导致意外行为。如果您需要共享状态,您应该使用类或模块变量。
class UserController < ApplicationController
@@all_users = User.all
def index
@users = @@all_users
end
end
上述代码中,用类变量 @@all_users
存储所有用户,然后通过 index
操作来获取并渲染这些用户。这种做法易于出现问题的,不建议使用。
控制器是 Rails 应用程序中重要的组件,并且开发人员应该对其有深入的理解。本文介绍了控制器的概念,如何创建和使用控制器,以及一些控制器的最佳实践。掌握这些知识后,您将能够更好地设计和构建 Rails 应用程序。