Rails 开发指南:从入门到实践 – wiki词典

Rails 开发指南:从入门到实践

引言

欢迎来到 Ruby on Rails 的世界!如果你正计划涉足 Web 开发,或寻求一个高效、优雅的框架,Ruby on Rails(通常简称为 Rails)无疑是一个极佳的选择。Rails 是一个使用 Ruby 语言编写的全栈 Web 应用程序开发框架,以其“约定优于配置”(Convention Over Configuration – CoC)和“不要重复自己”(Don’t Repeat Yourself – DRY)两大核心原则而闻名,旨在让 Web 开发变得更加愉快和高效。

本指南将带你从零开始,逐步深入了解 Rails 的核心概念和开发流程,助你从入门到实践,构建功能强大的 Web 应用。

1. Rails 简介与核心理念

什么是 Ruby on Rails?

Rails 是一个全栈的 Web 框架,提供了一整套工具和结构,用于快速开发数据库驱动的 Web 应用程序。它基于 Ruby 编程语言,并严格遵循 MVC(Model-View-Controller)架构模式。

Rails 的核心理念

  • 约定优于配置 (CoC): Rails 预设了 Web 应用程序开发的最佳实践,并提供了默认的约定。这意味着你无需编写大量繁琐的配置文件,只需遵循这些约定,Rails 就能自动为你处理许多底层细节。
  • 不要重复自己 (DRY): DRY 原则旨在减少代码冗余,提高代码的可维护性和可扩展性。Rails 通过代码生成器、模块化设计等机制,帮助开发者避免重复代码。

MVC 架构

Rails 严格遵循 MVC 架构模式,将应用程序的逻辑清晰地划分为三个主要部分:

  • Model (模型): 负责处理应用程序的数据和业务逻辑。它通常与数据库表进行交互,进行数据的存储、检索、验证和关联。在 Rails 中,Model 主要由 Active Record 库实现。
  • View (视图): 负责将 Model 提供的数据以用户友好的方式呈现。它通常是 HTML、CSS 和 JavaScript 的组合,其中嵌入了 Ruby 代码(使用 ERB 模板)。View 从 Controller 接收数据并将其格式化为用户界面。
  • Controller (控制器): 充当 Model 和 View 之间的协调者。它接收并处理用户请求,与 Model 交互以获取或更新数据,然后选择合适的 View 来呈现响应。

2. 环境准备与安装

在开始 Rails 开发之前,你需要安装 Ruby、Node.js 和 Rails 本身。

2.1. 安装 Ruby

Rails 需要 Ruby 3.2 或更高版本。推荐使用 Ruby 版本管理器(如 rbenvRVM)来安装和管理 Ruby 版本。

  • macOS/Linux (推荐使用 rbenv):
    1. 安装 Homebrew (macOS) 或系统依赖 (Linux)。
    2. 安装 rbenvruby-build
      bash
      git clone https://github.com/rbenv/rbenv.git ~/.rbenv
      echo 'eval "$(~/.rbenv/bin/rbenv init - bash)"' >> ~/.bash_profile
      git clone https://github.com/rbenv/ruby-build.git ~/.rbenv/plugins/ruby-build
      source ~/.bash_profile # 或 ~/.zshrc (如果你使用 Zsh)
    3. 安装 Ruby(请根据实际情况调整版本号):
      bash
      rbenv install 3.3.0
      rbenv global 3.3.0
      ruby -v # 验证 Ruby 版本
  • Windows (推荐使用 WSL2):
    在 Windows 上,推荐使用适用于 Linux 的 Windows 子系统 (WSL2) 来获得最佳的 Rails 开发体验。

    1. 安装 WSL2 和 Ubuntu 发行版。
    2. 在 WSL2 的 Ubuntu 终端中,按照 macOS/Linux 的步骤安装 Ruby。
    3. 你可以在 Windows 上安装 VS Code 并安装 WSL 扩展,以便在 Windows 中编辑代码,但在 WSL 中运行命令。

2.2. 安装 Node.js

Rails 应用程序通常需要 Node.js 来处理 JavaScript 资产。你可以从 Node.js 官方网站下载并安装适合你操作系统的版本,或者使用版本管理器(如 nvm)。

2.3. 安装 Rails

一旦 Ruby 和 Node.js 安装完毕,你就可以使用 Ruby 的包管理器 gem 来安装 Rails。

bash
gem install rails
rails -v # 验证 Rails 版本

如果 rails 命令未找到,尝试重启你的终端。

3. 创建第一个 Rails 应用程序

现在,让我们创建一个新的 Rails 应用程序。

bash
rails new my_first_app --database=postgresql # 或 --database=sqlite3 (如果你不想安装 PostgreSQL)
cd my_first_app

  • rails new my_first_app: 创建一个名为 my_first_app 的新 Rails 应用程序。
  • --database=postgresql: 指定使用 PostgreSQL 作为数据库。默认是 SQLite3。
  • cd my_first_app: 进入新创建的应用程序目录。

启动 Rails 服务器:

在应用程序目录中,运行以下命令启动 Rails 开发服务器:

bash
rails server # 或 rails s

打开浏览器,访问 http://localhost:3000。你将看到 Rails 的欢迎页面,这表明你的应用程序已成功运行。

应用程序目录结构概览

一个新创建的 Rails 应用程序包含以下主要目录:

  • app/: 应用程序的核心代码,包含 Models, Views, Controllers, Helpers 等。
    • assets/: 包含应用程序的静态资源,如图片、样式表 (CSS) 和 JavaScript 文件。
    • controllers/: 存放控制器文件。
    • models/: 存放模型文件。
    • views/: 存放视图模板文件。
  • config/: 应用程序的配置文件,如路由 (routes.rb)、数据库 (database.yml) 等。
  • db/: 数据库相关文件,如迁移文件 (migrate/) 和数据库 schema (schema.rb)。
  • public/: 静态文件,如 index.html、错误页面等。
  • test/: 应用程序的测试文件。

4. 核心概念深入

4.1. 数据库与迁移 (Migrations)

Rails 使用 Active Record 框架来处理数据库交互。Active Record 是一种 ORM (Object-Relational Mapping) 解决方案,它将数据库表映射到 Ruby 对象。

创建数据库:

在首次启动应用程序或更改数据库配置后,你需要创建数据库:

bash
rails db:create

数据库迁移 (Migrations):

迁移是 Rails 中管理数据库 schema 变更的强大功能。它们允许你使用 Ruby DSL (Domain Specific Language) 来描述对数据库表的更改,而不是直接编写 SQL。

让我们创建一个 Post 模型,它将对应数据库中的 posts 表。每个 Post 有一个 title (字符串) 和 content (文本)。

bash
rails generate model Post title:string content:text

这个命令会生成两个文件:
1. app/models/post.rb: Post 模型文件。
2. db/migrate/YYYYMMDDHHMMSS_create_posts.rb: 迁移文件,用于创建 posts 表。

打开生成的迁移文件 (db/migrate/YYYYMMDDHHMMSS_create_posts.rb),内容大致如下:

“`ruby

db/migrate/YYYYMMDDHHMMSS_create_posts.rb

class CreatePosts < ActiveRecord::Migration[7.1] # 版本号可能不同
def change
create_table :posts do |t|
t.string :title
t.text :content

  t.timestamps # 这会添加 created_at 和 updated_at 两个时间戳字段
end

end
end
``change` 方法足够智能,知道如何执行迁移以及如何回滚。

运行迁移:

要将这些更改应用到数据库,运行迁移命令:

bash
rails db:migrate

这会在数据库中创建 posts 表。

4.2. 路由 (Routing)

Rails 路由系统负责将传入的 HTTP 请求映射到控制器 (Controller) 的特定动作 (Action)。路由定义在 config/routes.rb 文件中。

打开 config/routes.rb 文件。

RESTful 路由:

Rails 鼓励使用 RESTful 架构,它将应用程序的资源(如 Post)映射到标准的 HTTP 动词 (GET, POST, PUT/PATCH, DELETE) 和 URL 模式。

posts 资源添加 RESTful 路由:

“`ruby

config/routes.rb

Rails.application.routes.draw do
resources :posts
# 定义根路由
root “posts#index”
end
``resources :posts这一行代码会自动生成七个 RESTful 路由,对应posts` 资源的 CRUD (Create, Read, Update, Delete) 操作。

你可以通过运行 rails routes 命令查看所有已定义的路由。

5. CRUD 操作实践 (以博客文章为例)

现在我们来构建一个简单的博客应用,实现 Post 资源的 CRUD 操作。

5.1. 生成控制器

bash
rails generate controller Posts

这会创建一个 app/controllers/posts_controller.rb 文件。

5.2. 实现控制器动作 (Controller Actions)

打开 app/controllers/posts_controller.rb 并添加以下代码:

“`ruby

app/controllers/posts_controller.rb

class PostsController < ApplicationController
before_action :set_post, only: [:show, :edit, :update, :destroy]

# GET /posts
def index
@posts = Post.all
end

# GET /posts/:id
def show
end

# GET /posts/new
def new
@post = Post.new
end

# POST /posts
def create
@post = Post.new(post_params)
if @post.save
redirect_to @post, notice: ‘Post was successfully created.’
else
render :new, status: :unprocessable_entity
end
end

# GET /posts/:id/edit
def edit
end

# PATCH/PUT /posts/:id
def update
if @post.update(post_params)
redirect_to @post, notice: ‘Post was successfully updated.’
else
render :edit, status: :unprocessable_entity
end
end

# DELETE /posts/:id
def destroy
@post.destroy
redirect_to posts_url, notice: ‘Post was successfully destroyed.’
end

private

# Use callbacks to share common setup or constraints between actions.
def set_post
@post = Post.find(params[:id])
end

# Only allow a list of trusted parameters through.
def post_params
params.require(:post).permit(:title, :content)
end
end
``
*
before_action :set_post: 在show,edit,update,destroy动作执行前调用set_post方法,用于查找对应的Post对象。
*
post_params: 用于强参数 (strong parameters),确保只有titlecontent` 字段可以被用户提交,这是 Rails 的安全机制。

5.3. 创建视图 (Views)

app/views/posts/ 目录下创建以下视图文件:

app/views/posts/index.html.erb (列出所有文章)

“`html

Posts

<% @posts.each do |post| %>

<% end %>

Title Content
<%= post.title %> <%= post.content %> <%= link_to 'Show', post %> <%= link_to 'Edit', edit_post_path(post) %> <%= link_to 'Destroy', post, method: :delete, data: { confirm: 'Are you sure?' } %>

<%= link_to ‘New Post’, new_post_path %>
“`

app/views/posts/show.html.erb (显示单篇文章)

“`html

<%= notice %>

Title:
<%= @post.title %>

Content:
<%= @post.content %>

<%= link_to ‘Edit’, edit_post_path(@post) %> |
<%= link_to ‘Back’, posts_path %>
“`

app/views/posts/new.html.erb (创建新文章的表单)

“`html

New Post

<%= render ‘form’, post: @post %>

<%= link_to ‘Back’, posts_path %>
“`

app/views/posts/edit.html.erb (编辑文章的表单)

“`html

Editing Post

<%= render ‘form’, post: @post %>

<%= link_to ‘Show’, @post %> |
<%= link_to ‘Back’, posts_path %>
“`

app/views/posts/_form.html.erb (表单局部视图)

为了遵循 DRY 原则,创建和编辑表单通常会提取到一个局部视图 (partial) 中。

“`html
<%# app/views/posts/_form.html.erb %>
<%= form_with(model: post) do |form| %>
<% if post.errors.any? %>

<%= pluralize(post.errors.count, “error”) %> prohibited this post from being saved:

  <ul>
    <% post.errors.each do |error| %>
      <li><%= error.full_message %></li>
    <% end %>
  </ul>
</div>

<% end %>

<%= form.label :title %>
<%= form.text_field :title %>
<%= form.label :content %>
<%= form.text_area :content %>
<%= form.submit %>

<% end %>
``
*
form_with: Rails 的表单辅助方法,用于生成 HTML 表单,并绑定到模型对象。
*
form.label,form.text_field,form.text_area,form.submit: 这些是form_with` 提供的辅助方法,用于生成表单元素。

5.4. 验证 (Validations)

为了确保数据的完整性,我们可以在模型中添加验证。打开 app/models/post.rb 并添加验证:

“`ruby

app/models/post.rb

class Post < ApplicationRecord
validates :title, presence: true, length: { minimum: 5 }
validates :content, presence: true
end
``
现在,如果尝试创建一个标题少于 5 个字符或内容为空的
Post`,模型将不会保存,并且会在表单中显示错误信息。

5.5. 使用 scaffold 快速生成 CRUD

在实际开发中,如果你需要快速搭建一个资源的 CRUD 界面,可以使用 scaffold 命令。它会生成模型、迁移、控制器、视图和路由等所有必要的文件。

例如,要创建一个 Product 资源:

bash
rails generate scaffold Product name:string price:decimal description:text
rails db:migrate

然后访问 http://localhost:3000/products 即可看到完整的 CRUD 界面。

6. 测试 (Testing)

Rails 内置了测试框架 Minitest,并鼓励编写测试。测试是确保应用程序质量和可维护性的关键。

6.1. Minitest (Rails 默认)

当你生成模型或控制器时,Rails 会自动生成对应的测试文件。例如,生成 Post 模型时,会生成 test/models/post_test.rb

运行测试:

bash
rails test

这会运行所有测试。你也可以运行特定文件或目录的测试。

6.2. RSpec (流行的替代品)

RSpec 是一个行为驱动开发 (BDD) 框架,在 Rails 社区中非常流行。如果你想使用 RSpec,你需要将其添加到 Gemfile 并运行安装命令。

  1. 添加到 Gemfile
    ruby
    group :development, :test do
    gem 'rspec-rails'
    end
  2. 运行 bundle install
  3. 安装 RSpec:
    bash
    rails generate rspec:install

    现在,当你生成模型或控制器时,RSpec 风格的测试文件将取代 Minitest 文件。

7. 部署 (Deployment)

将 Rails 应用程序部署到生产环境是开发流程的最后一步。常见的部署平台包括 Heroku, Render, DigitalOcean, AWS 等。部署通常涉及以下步骤:

  1. 准备生产环境: 配置数据库、环境变量等。
  2. 资产预编译: Rails 会将 CSS、JavaScript 等静态资产进行压缩和合并。
  3. Web 服务器配置: 使用 Puma, Unicorn 等 Web 服务器。
  4. 反向代理: 使用 Nginx 或 Apache 作为反向代理。

具体的部署步骤会因平台而异,但 Rails 提供了工具和指南来简化这个过程。

8. 总结与下一步

本指南涵盖了 Ruby on Rails 开发的基础知识,包括:

  • Rails 的核心理念、MVC 架构及其优势。
  • 环境设置和 Rails 安装。
  • 创建新的 Rails 应用程序并理解其目录结构。
  • 使用 Active Record 进行数据库交互,并通过迁移管理 schema 变更。
  • 配置路由,实现 RESTful 接口。
  • 通过控制器和视图实现完整的 CRUD 操作。
  • 了解 Rails 内置的测试机制。
  • 部署应用程序的基本概念。

下一步学习:

  • 深入学习 Ruby 语言: Rails 建立在 Ruby 之上,扎实的 Ruby 基础将极大地帮助你。
  • Rails Guides: 官方文档是最好的学习资源:https://guides.rubyonrails.org/
  • Active Record 关联: 学习如何处理模型之间的关系(一对一、一对多、多对多)。
  • 认证和授权: 实现用户登录、注册和权限管理。
  • 前端集成: 学习如何与 JavaScript 框架(如 React, Vue)或 CSS 框架(如 Tailwind CSS, Bootstrap)集成。
  • API 开发: Rails 也可以作为强大的 API 后端。
  • 性能优化和安全: 学习如何优化应用程序的性能和提高安全性。

祝你在 Ruby on Rails 的学习旅程中一切顺利,希望你享受构建 Web 应用的乐趣!

滚动至顶部