Ruby on Rails 开发实战:构建你的第一个 Web 应用
Ruby on Rails (简称 Rails) 是一个功能强大且备受欢迎的 Web 应用框架,它基于 Ruby 语言构建。Rails 以其“约定优于配置”(Convention over Configuration) 和“不要重复自己”(Don’t Repeat Yourself, DRY) 的设计哲学而闻名,旨在让开发者能够快速、高效地构建复杂的网站。
本教程将带你从零开始,一步步创建一个完整的 Rails 项目:一个简单的博客系统。你将学习如何设置环境、创建项目、构建核心功能,并理解 Rails 的 MVC (Model-View-Controller) 架构。
1. 准备工作:安装必备工具
在开始之前,请确保你的电脑上安装了以下软件:
- Ruby: Rails 是一个 Ruby gem (库),所以你需要先安装 Ruby。推荐使用版本管理工具如
rbenv或RVM来安装,这能让你轻松切换不同的 Ruby 版本。 - Rails: 安装完 Ruby 后,在终端中运行以下命令来安装 Rails:
bash
gem install rails - 数据库: Rails 支持多种数据库。对于初学者,SQLite3 是最简单的选择,因为它无需额外安装和配置。对于生产环境,PostgreSQL 是更强大和推荐的选择。
- 代码编辑器: 一个好的代码编辑器能极大提升效率,推荐使用 Visual Studio Code,并安装 Ruby 和 Rails 相关的扩展。
- Git: 版本控制是现代软件开发的标配,请确保你已安装并配置好 Git。
2. 创建你的第一个 Rails 项目
万事俱备,让我们开始创建项目。打开终端,执行以下命令:
bash
rails new simple_blog
这个命令会创建一个名为 simple_blog 的文件夹,并自动生成 Rails 应用所需的所有文件和目录结构。
进入项目目录:
bash
cd simple_blog
现在,让我们启动 Rails 内置的 Web 服务器:
bash
rails server
或者使用缩写 rails s。
打开你的浏览器,访问 http://localhost:3000。如果一切顺利,你会看到 Rails 的欢迎页面。这表明你的项目已经成功创建并运行起来了。
3. MVC 架构:Rails 的核心
在深入编码之前,理解 MVC 架构至关重要:
- Model (模型): 负责与数据库交互,处理数据和业务逻辑。在 Rails 中,一个模型对应数据库中的一张表。
- View (视图): 负责生成用户界面 (UI),通常是 HTML 页面。它从控制器获取数据并展示给用户。
- Controller (控制器): 作为模型和视图之间的桥梁。它接收用户的请求,从模型获取数据,然后将数据传递给视图进行渲染。
4. 构建核心功能:文章 (Posts)
我们的博客需要有文章。我们将使用 Rails 的脚手架 (Scaffold) 功能来快速生成文章的 CRUD (创建、读取、更新、删除) 功能。
在终端中运行以下命令(确保你已停止 rails server):
bash
rails generate scaffold Post title:string body:text
这个命令告诉 Rails:
* generate scaffold: 生成一个完整的资源脚手架。
* Post: 资源名称是 “Post” (文章)。Rails 会自动将其映射到名为 Post 的模型和名为 posts 的数据库表。
* title:string: 文章有一个标题 (title),其数据类型是字符串 (string)。
* body:text: 文章有一个正文 (body),其数据类型是文本 (text),适合存储较长的内容。
这个命令会创建以下主要文件:
* app/models/post.rb: Post 模型文件。
* app/controllers/posts_controller.rb: Posts 控制器文件,包含了处理文章 CRUD 操作的所有方法。
* app/views/posts/: 存放文章相关视图文件的目录 (如 index.html.erb, show.html.erb 等)。
* db/migrate/xxxxxxxx_create_posts.rb: 一个数据库迁移文件,用于在数据库中创建 posts 表。
* config/routes.rb: 更新路由文件,添加了处理文章资源的路由规则。
5. 更新数据库
我们已经定义了 posts 表的结构(在迁移文件中),现在需要执行迁移来让数据库更新:
bash
rails db:migrate
这个命令会执行所有尚未执行的迁移文件,在数据库中创建 posts 表,并添加 title 和 body 两个字段。
6. 探索你的博客应用
现在,重新启动 Rails 服务器:
bash
rails server
然后,在浏览器中访问 http://localhost:3000/posts。
你会看到一个简单的文章列表页面。尝试以下操作:
* 点击 “New post” 按钮,创建一个新的文章。
* 创建后,你会跳转到文章的详情页。
* 返回列表页,点击 “Edit” 来修改文章。
* 点击 “Destroy” 来删除文章。
恭喜你!你已经拥有了一个功能齐全的博客系统。这一切都归功于 Rails 的脚手架功能。
7. 添加关联:评论 (Comments)
一个博客不能没有评论功能。让我们来为文章添加评论。
首先,生成一个 Comment 模型,并将其与 Post 模型关联起来:
bash
rails generate model Comment body:text post:references
这个命令会:
* 创建一个 Comment 模型。
* 它有一个 body 字段。
* post:references 是一个特殊的指令,它会自动在 comments 表中添加一个 post_id 字段,并设置好数据库索引和外键。这用于表明一条评论“属于”一篇文章。
接下来,我们需要手动设置模型之间的关联关系:
-
打开
app/models/post.rb,添加has_many :comments。这表示一篇文章可以拥有多条评论。为了让删除文章时能同时删除其所有评论,我们加上dependent: :destroy:
ruby
class Post < ApplicationRecord
has_many :comments, dependent: :destroy
validates :title, presence: true
end
(我们还顺便为Post模型添加了一个验证,要求标题不能为空) -
打开
app/models/comment.rb,Rails 的生成器应该已经自动添加了belongs_to :post。这表示一条评论属于一篇文章。
现在,再次运行数据库迁移来创建 comments 表:
bash
rails db:migrate
8. 配置嵌套路由
为了让评论的 URL 看起来更直观 (例如 posts/1/comments/new),我们需要配置嵌套路由。
打开 config/routes.rb 文件,将 resources :posts 修改为:
ruby
Rails.application.routes.draw do
resources :posts do
resources :comments
end
root "posts#index" # 将根路径设置为文章列表页
end
resources :comments 嵌套在 resources :posts 内部,为我们生成了评论相关的路由。我们还添加了 root "posts#index",这样访问 http://localhost:3000 时会直接显示文章列表。
9. 创建评论控制器和视图
我们需要一个地方来处理创建评论的逻辑。
-
创建控制器:
bash
rails generate controller Comments -
编辑
app/controllers/comments_controller.rb,添加create和destroy方法:
“`ruby
class CommentsController < ApplicationController
def create
@post = Post.find(params[:post_id])
@comment = @post.comments.create(comment_params)
redirect_to post_path(@post)
enddef destroy
@post = Post.find(params[:post_id])
@comment = @post.comments.find(params[:id])
@comment.destroy
redirect_to post_path(@post), status: :see_other
endprivate
def comment_params
params.require(:comment).permit(:body)
end
end
“` -
在文章详情页显示评论并添发表单:
打开app/views/posts/show.html.erb,在文件末尾添加以下代码:“`erb
<%# — 在文件末尾添加以下内容 — %>Comments
<% @post.comments.each do |comment| %>
Comment:
<%= comment.body %><%= link_to “Delete Comment”, [comment.post, comment], data: {
turbo_method: :delete,
turbo_confirm: “Are you sure?”
} %><% end %>
Add a comment:
<%= form_with(model: [ @post, @post.comments.build ]) do |form| %>
<%= form.label :body %>
<%= form.text_area :body %><%= form.submit %>
<% end %>
“`
现在,刷新你的文章详情页。你会看到一个用于添加评论的表单和已存在的评论列表。尝试添加和删除几条评论,你会发现一切都已正常工作!
总结与下一步
通过本教程,你已经:
* 成功搭建了 Rails 开发环境。
* 创建并运行了一个 Rails 项目。
* 使用脚手架快速构建了文章的 CRUD 功能。
* 理解并实践了模型之间的 has_many / belongs_to 关联。
* 配置了嵌套路由来组织 URL。
* 手动创建了控制器和视图来处理评论功能。
这只是 Rails 世界的冰山一角。接下来,你可以探索更多有趣的功能:
* 用户认证: 使用 Devise gem 为你的博客添加用户注册和登录功能。
* 美化界面: 学习使用 CSS 框架如 Bootstrap 或 Tailwind CSS 来美化你的应用。
* 部署上线: 将你的应用部署到 Render 或 Heroku 等云平台,让全世界都能访问你的作品。
继续探索,享受使用 Rails 构建应用的乐趣吧!