Ruby on Rails 教程:从零开始构建你的第一个Web应用
Ruby on Rails(简称Rails)是一个使用Ruby语言编写的开源Web应用框架。它以“约定优于配置”(Convention Over Configuration)和“不要重复自己”(Don’t Repeat Yourself, DRY)的原则而闻名,极大地提高了Web开发的效率和乐趣。本教程将引导你从零开始,逐步构建一个简单的Rails应用,让你对Rails的核心概念有一个全面的了解。
1. 为什么选择 Ruby on Rails?
在深入之前,我们先了解一下Rails的优势:
- 开发效率高:大量的约定和内置工具,让开发者能够快速搭建应用原型和交付功能。
- 社区活跃:拥有庞大而热情的社区,提供丰富的文档、插件(Gem)和支持。
- 优雅的语法:Ruby语言本身具有很高的可读性和表达力,使代码更易于理解和维护。
- 全栈框架:集成了前端(HTML, CSS, JavaScript)、后端(Ruby)、数据库(ORM)等所有Web开发所需组件。
- 遵循最佳实践:鼓励开发者采用MVC(Model-View-Controller)架构,测试驱动开发(TDD)等行业最佳实践。
2. 准备工作:安装环境
在开始Rails开发之前,你需要安装以下软件:
- Ruby:Rails框架是基于Ruby语言的。
- Rails:Rails框架本身。
- 数据库:通常是SQLite3(开发环境默认)、PostgreSQL或MySQL。
- Node.js & Yarn:Rails 6+ 依赖它们管理前端资产。
安装步骤 (以macOS/Linux为例,Windows用户建议使用WSL2):
-
安装 RVM 或 rbenv (Ruby版本管理器,推荐)
- RVM:
bash
gpg --keyserver hkp://keys.gnupg.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3 7D2BAF1CE0EE8953ADF71AEC6D5A2DCF0C3B3E08
\curl -sSL https://get.rvm.io | bash -s stable --ruby
source ~/.rvm/scripts/rvm # 将此行添加到 .bashrc 或 .zshrc - rbenv:
bash
brew install rbenv ruby-build # macOS
# 对于Linux,请参考rbenv官方文档安装
echo 'eval "$(rbenv init -)"' >> ~/.bashrc # 或 ~/.zshrc
source ~/.bashrc # 或 ~/.zshrc
- RVM:
-
安装 Ruby (使用版本管理器)
- 使用RVM:
bash
rvm install 3.2.2 # 安装一个最新稳定版本,例如 3.2.2
rvm use 3.2.2 --default - 使用rbenv:
bash
rbenv install 3.2.2
rbenv global 3.2.2 - 验证Ruby安装:
ruby -v
- 使用RVM:
-
安装 Rails
bash
gem install rails -v 7.1.3 # 安装一个最新稳定版本,例如 7.1.3- 验证Rails安装:
rails -v
- 验证Rails安装:
-
安装 Node.js 和 Yarn
- macOS:
brew install node yarn - Linux: 请参考官方文档安装 Node.js 和 Yarn。
- 验证:
node -v,yarn -v
- macOS:
3. 创建你的第一个Rails应用
现在我们来创建一个名为 blog 的应用。
bash
rails new blog
cd blog
这个命令会生成一个完整的Rails应用骨架。你会看到许多文件和目录。一些重要的目录包括:
app/:应用的核心代码,包含模型(models)、视图(views)、控制器(controllers)。config/:配置文件,如路由(routes)、数据库连接(database.yml)。db/:数据库相关文件,如迁移(migrations)和种子数据(seeds)。public/:静态文件,如图片、JavaScript、CSS。
启动Rails服务器:
bash
rails server
在浏览器中访问 http://localhost:3000,如果看到“Yay! You’re on Rails!”页面,说明你的应用已成功运行。
4. Rails核心概念:MVC架构
Rails严格遵循MVC(Model-View-Controller)架构模式。
- Model (模型):负责数据和业务逻辑。它们与数据库交互(如保存、读取、更新、删除数据),并定义数据验证规则。在Rails中,模型通常继承自
ActiveRecord::Base。 - View (视图):负责数据的展示。它们接收控制器传递的数据,并渲染成用户界面(通常是HTML)。Rails视图使用ERB(Embedded Ruby)模板语言。
- Controller (控制器):负责处理用户请求。它接收来自路由的请求,与模型交互获取数据,然后将数据传递给视图进行展示。
5. 构建博客应用:创建文章资源
我们的博客应用将允许用户创建、查看、编辑和删除文章。在Rails中,我们称之为“资源”。
5.1 生成文章资源
Rails提供了强大的生成器来自动化创建代码。我们将使用 scaffold 生成器来快速构建文章的所有MVC组件:
bash
rails generate scaffold Article title:string content:text
这个命令做了很多事情:
- 创建了一个
Article模型,包含title(字符串) 和content(文本) 字段。 - 创建了一个
articles_controller.rb控制器,包含处理CRUD操作的动作。 - 创建了与文章相关的视图文件(
index,show,new,edit表单)。 - 创建了一个数据库迁移文件,用于在数据库中创建
articles表。 - 更新了
config/routes.rb文件,添加了文章资源的路由。
5.2 运行数据库迁移
现在我们需要将新创建的 articles 表应用到数据库中:
bash
rails db:migrate
这个命令会根据迁移文件修改你的数据库结构。
5.3 查看效果
现在你可以在浏览器中访问 http://localhost:3000/articles。你将看到一个基本的文章列表页面,你可以点击“New Article”来创建新文章,并进行编辑和删除操作。这证明了 scaffold 的强大之处,它在几秒钟内提供了一个功能完整的CRUD界面。
6. 理解路由 (Routing)
config/routes.rb 文件定义了URL如何映射到控制器动作。
打开 config/routes.rb,你会看到类似这样的代码:
“`ruby
Rails.application.routes.draw do
resources :articles
# Define your application routes per the DSL in https://guides.rubyonrails.org/routing.html
# Reveal health status on /up that returns 200 if the app boots with no exceptions, otherwise 500.
# Can be used by load balancers and uptime monitors to verify that the app is live.
get “up” => “rails/health#show”, as: :rails_health_check
# Defines the root path route (“/”)
# root “posts#index”
end
“`
resources :articles 这一行是 Rails 的路由 DSL (Domain Specific Language),它会自动为 articles 资源生成7个RESTful路由:
| HTTP 方法 | 路径 | 控制器动作 | 作用 |
|---|---|---|---|
| GET | /articles |
articles#index |
列出所有文章 |
| GET | /articles/:id |
articles#show |
显示单篇文章 |
| GET | /articles/new |
articles#new |
新建文章表单 |
| POST | /articles |
articles#create |
创建新文章 |
| GET | /articles/:id/edit |
articles#edit |
编辑文章表单 |
| PATCH/PUT | /articles/:id |
articles#update |
更新文章 |
| DELETE | /articles/:id |
articles#destroy |
删除文章 |
你也可以定义根路径:
ruby
root "articles#index" # 设置应用的根路径为文章列表页
现在访问 http://localhost:3000 就会直接跳转到文章列表页。
7. 深入模型 (Model)
打开 app/models/article.rb:
ruby
class Article < ApplicationRecord
validates :title, presence: true, length: { minimum: 5 }
validates :content, presence: true
end
这里我们添加了数据验证 (Validations):
validates :title, presence: true, length: { minimum: 5 }:标题不能为空,且长度至少为5个字符。validates :content, presence: true:内容不能为空。
这些验证会在保存文章到数据库之前自动运行。如果验证失败,article.save 会返回 false,并且 article.errors 会包含详细的错误信息。
8. 理解控制器 (Controller)
打开 app/controllers/articles_controller.rb。你会看到许多动作(方法),例如 index, show, new, create, edit, update, destroy。
以 create 动作为例:
“`ruby
POST /articles
def create
@article = Article.new(article_params) # 创建新文章对象
if @article.save # 尝试保存文章到数据库
redirect_to @article, notice: “Article was successfully created.” # 保存成功,重定向到文章详情页
else
render :new, status: :unprocessable_entity # 保存失败,重新渲染新建表单,并显示错误
end
end
private
# Only allow a list of trusted parameters through.
def article_params
params.require(:article).permit(:title, :content)
end
“`
@article = Article.new(article_params):创建一个新的Article实例,并使用article_params方法过滤用户提交的参数。这被称为“强参数”(Strong Parameters),是Rails的安全特性,防止恶意用户提交未经允许的参数。@article.save:尝试将文章保存到数据库。如果模型验证失败,此方法会返回false。redirect_to @article:重定向到刚刚创建的文章的详情页(show动作)。render :new:如果保存失败,重新渲染new视图,以便用户可以修正错误。status: :unprocessable_entity设定HTTP状态码为422,告知浏览器请求由于语义错误无法处理。
9. 视图 (View) 基础
视图文件位于 app/views/articles/ 目录下。它们使用ERB模板(以 .html.erb 结尾)。
例如,app/views/articles/index.html.erb 显示文章列表:
“`html+erb
Articles
<%= render article %>
<% end %>
<%= link_to “New article”, new_article_path %>
“`
这里:
<% @articles.each do |article| %> ... <% end %>是Ruby代码块,用于遍历控制器传来的@articles集合。<%= render article %>是一个局部视图渲染的例子。Rails会查找_article.html.erb文件来渲染单个article对象。<%= link_to "New article", new_article_path %>是一个Rails助手方法,用于生成HTML链接。new_article_path是由resources :articles路由自动生成的路径助手。
打开 app/views/articles/_article.html.erb,你会看到渲染单篇文章的代码:
“`html+erb
“`
10. 部署 (Deployment)
当你的Rails应用开发完成后,你可能需要将其部署到生产环境。常见的部署平台包括:
- Heroku:简单易用,适合初学者快速部署。
- Render:现代化的云平台,支持多种语言和数据库。
- Capistrano:一个Ruby Gem,用于自动化部署到自己的服务器。
- AWS / Google Cloud / Azure:更灵活但也更复杂的云服务。
部署涉及到数据库配置、环境变量设置、资产编译等步骤,具体方法会因平台而异。
11. 接下来学习什么?
恭喜你,你已经迈出了Rails开发的第一步!为了进一步提升你的技能,你可以学习以下主题:
- 数据库关联 (Associations):如
has_many,belongs_to等,用于建立模型之间的关系(例如,一篇文章可以有多个评论)。 - 用户认证与授权 (Authentication & Authorization):使用
Devise等Gem来处理用户注册、登录和权限管理。 - Action Text & Active Storage:Rails内置的富文本编辑器和文件上传解决方案。
- JavaScript 与前端集成 (Hotwire / React / Vue):Rails 7 默认使用 Hotwire 栈 (Turbo 和 Stimulus) 实现交互性,你也可以集成其他前端框架。
- 测试 (Testing):学习如何编写单元测试、集成测试和系统测试,确保代码质量。
- 背景任务 (Background Jobs):使用
Sidekiq或GoodJob处理耗时任务,如发送邮件。 - API 开发:将Rails应用作为API后端,供移动应用或SPA(Single Page Application)调用。
总结
Ruby on Rails是一个强大、高效且令人愉悦的Web开发框架。通过遵循“约定优于配置”的原则,它让开发者能够专注于业务逻辑,而不是繁琐的配置。本教程只是一个起点,但希望能为你打开Rails世界的大门,助你从零开始,逐步成为一名熟练的Rails开发者!祝你编程愉快!