📜  Ruby on Rails-控制器(1)

📅  最后修改于: 2023-12-03 15:34:45.590000             🧑  作者: Mango

Ruby on Rails 控制器

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 来渲染用户列表。
创建和使用控制器

创建并使用控制器需要经过以下步骤:

步骤 1:创建控制器

控制器通过 Rails 生成器命令创建:

rails generate controller User

会将如下文件添加到应用目录:

app/controllers/user_controller.rb
app/views/user
步骤 2:定义操作

打开 app/controllers/user_controller.rb 文件并定义操作。例如,我们在 UserController 中定义了 index 操作。

class UserController < ApplicationController
  def index
    @users = User.all
  end
end
步骤 3:定义视图

app/views/user/ 目录中创建名为 index.html.erb 的视图文件。

<h1>Users List:</h1>
<ul>
  <% @users.each do |user| %>
    <li><%= user.name %></li>
  <% end %>
</ul>
步骤 4:配置路由

我们需要将路由连接到刚刚创建的 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_actionafter_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 应用程序。