Ruby on Rails 入门教程:路由与控制器

Ruby on Rails(通常简称为 Rails)是一个强大的 web 应用框架,基于 Ruby 编程语言。它遵循 MVC(模型-视图-控制器)架构模式,使得开发者能够快速构建高效的 web 应用。在本篇教程中,我们将深入探讨 Rails 中的路由与控制器,帮助你理解如何处理 HTTP 请求并将其映射到相应的控制器动作。

一、路由(Routing)

1. 路由的概念

在 Rails 中,路由负责将传入的 HTTP 请求映射到相应的控制器和动作。路由文件通常位于 config/routes.rb 中。Rails 提供了一个 DSL(领域特定语言)来定义路由,使得路由的配置变得简单而直观。

2. 基本路由

最基本的路由定义如下:

# config/routes.rb
Rails.application.routes.draw do
  get 'welcome/index'
end

在这个例子中,当用户访问 /welcome/index 时,Rails 会调用 WelcomeControllerindex 方法。

优点:

  • 简单易懂,适合初学者。
  • 通过 RESTful 风格的路由,能够清晰地表达资源的操作。

缺点:

  • 对于复杂的应用,路由文件可能会变得庞大且难以维护。

注意事项:

  • 确保路由的顺序,因为 Rails 会按照定义的顺序匹配路由。

3. RESTful 路由

Rails 强烈推荐使用 RESTful 风格的路由。REST(Representational State Transfer)是一种架构风格,允许通过 HTTP 方法(GET、POST、PUT、DELETE)来操作资源。

使用 resources 方法可以快速生成 RESTful 路由:

# config/routes.rb
Rails.application.routes.draw do
  resources :articles
end

这将自动生成以下路由:

HTTP Verb | Path               | Controller#Action
-----------|--------------------|-------------------
GET       | /articles          | articles#index
GET       | /articles/new      | articles#new
POST      | /articles          | articles#create
GET       | /articles/:id      | articles#show
GET       | /articles/:id/edit | articles#edit
PATCH/PUT | /articles/:id      | articles#update
DELETE    | /articles/:id      | articles#destroy

优点:

  • 通过 RESTful 路由,能够清晰地表达资源的 CRUD(创建、读取、更新、删除)操作。
  • 使得 API 的设计更加一致和可预测。

缺点:

  • 对于不符合 RESTful 设计的资源,可能需要额外的路由配置。

注意事项:

  • 使用 onlyexcept 选项来限制生成的路由。例如:
resources :articles, only: [:index, :show]

二、控制器(Controllers)

1. 控制器的概念

控制器是 Rails 应用中的核心部分,负责处理用户请求、与模型交互并返回响应。控制器通常位于 app/controllers 目录下。

2. 创建控制器

可以使用 Rails 提供的生成器来创建控制器:

rails generate controller Welcome index

这将创建一个 WelcomeController,并在其中定义 index 方法。

# app/controllers/welcome_controller.rb
class WelcomeController < ApplicationController
  def index
    @message = "Welcome to Ruby on Rails!"
  end
end

3. 控制器动作

控制器中的每个方法称为一个动作(action),它们对应于路由中定义的路径。可以在动作中处理请求参数、与模型交互并设置实例变量,以便在视图中使用。

# app/controllers/articles_controller.rb
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

优点:

  • 控制器将请求处理逻辑与视图分离,使得代码更加清晰。
  • 可以通过 before_action 过滤器来处理重复的逻辑,例如身份验证。

缺点:

  • 如果控制器中的逻辑过于复杂,可能会导致控制器变得臃肿。

注意事项:

  • 使用 private 方法来封装参数处理逻辑,保持控制器的整洁。

4. 视图与控制器的交互

控制器通过实例变量将数据传递给视图。在视图中,可以使用这些实例变量来渲染内容。

<!-- app/views/welcome/index.html.erb -->
<h1><%= @message %></h1>

5. 错误处理

在控制器中处理错误是非常重要的。可以使用 rescue_from 方法来捕获异常并返回友好的错误页面。

class ArticlesController < ApplicationController
  rescue_from ActiveRecord::RecordNotFound, with: :record_not_found

  private

  def record_not_found
    render file: "#{Rails.root}/public/404.html", status: :not_found
  end
end

三、总结

在本教程中,我们深入探讨了 Ruby on Rails 中的路由与控制器。我们学习了如何定义路由、创建控制器、处理请求以及与视图交互。通过使用 RESTful 路由和控制器的最佳实践,我们能够构建出结构清晰、易于维护的 web 应用。

最佳实践

  1. 保持路由简洁:尽量避免在路由文件中定义过多的复杂路由。
  2. 控制器职责单一:每个控制器应专注于处理特定资源的请求,避免将多个资源的逻辑混合在一起。
  3. 使用过滤器:利用 before_actionafter_action 过滤器来处理重复逻辑。
  4. 错误处理:确保在控制器中处理可能出现的错误,以提高用户体验。

通过掌握路由与控制器的使用,你将能够更有效地构建和维护 Ruby on Rails 应用。希望本教程对你有所帮助,祝你在 Rails 开发的旅程中一帆风顺!