Ruby on Rails 框架入门
一、Ruby on Rails 框架简介
Ruby on Rails(通常简称为 Rails)是一个基于 Ruby 语言的开源 Web 应用程序框架,遵循模型 - 视图 - 控制器(Model - View - Controller,MVC)架构模式。它旨在使开发人员能够快速且高效地构建数据库驱动的 Web 应用程序,通过约定优于配置(Convention over Configuration,CoC)的原则,减少了开发过程中需要编写的样板代码数量。
Rails 的主要目标是提高开发人员的生产力,它提供了一套丰富的工具和库,用于处理 Web 开发中的常见任务,如数据库交互、路由、视图渲染等。这使得开发人员可以专注于业务逻辑的实现,而不必花费大量时间在底层的基础设施搭建上。
二、安装 Ruby on Rails
在开始使用 Rails 之前,需要先安装 Ruby 环境。Ruby 可以通过多种方式安装,以下以在 Ubuntu 系统上为例:
- 安装 Ruby
sudo apt - get update sudo apt - get install ruby - full
- 安装 RubyGems:RubyGems 是 Ruby 的包管理器,用于安装和管理 Ruby 库和应用程序。在大多数情况下,安装 Ruby 时会一并安装 RubyGems。可以通过以下命令检查是否安装成功:
gem - v
- 安装 Rails:使用 RubyGems 安装 Rails 框架。
gem install rails
安装完成后,可以通过以下命令检查 Rails 版本:
rails - v
三、创建第一个 Rails 应用程序
- 生成新的 Rails 项目:使用
rails new
命令来创建一个新的 Rails 应用程序。假设我们要创建一个名为myapp
的应用程序,可以在终端中执行以下命令:rails new myapp
这将在当前目录下创建一个名为 myapp
的新目录,其中包含了 Rails 应用程序的基本结构。
-
目录结构解析:进入
myapp
目录,可以看到以下主要目录和文件:- app:这个目录包含了应用程序的核心代码,包括控制器、模型、视图等。
- controllers:存放控制器文件,负责处理 HTTP 请求并协调模型和视图。
- models:包含应用程序的数据模型,用于与数据库交互。
- views:存放视图文件,负责呈现用户界面。
- config:包含应用程序的配置文件,如数据库配置、路由配置等。
- db:存放数据库相关的文件,如迁移文件和种子数据文件。
- Gemfile:列出了应用程序所依赖的 Ruby 库(gems)。
- app:这个目录包含了应用程序的核心代码,包括控制器、模型、视图等。
-
启动 Rails 服务器:在
myapp
目录下,使用以下命令启动 Rails 服务器:cd myapp rails server
启动成功后,可以在浏览器中访问 http://localhost:3000
,将会看到 Rails 的欢迎页面,表明应用程序已成功启动。
四、Rails 中的模型(Model)
-
模型的概念:在 Rails 中,模型是应用程序的数据抽象,通常与数据库中的表相对应。每个模型都是一个继承自
ActiveRecord::Base
的 Ruby 类,ActiveRecord
是 Rails 提供的一个强大的对象关系映射(Object - Relational Mapping,ORM)库,它允许开发人员通过 Ruby 代码与数据库进行交互,而无需编写原始的 SQL 语句。 -
创建模型:假设我们要创建一个名为
User
的模型,用于表示应用程序中的用户。可以使用以下命令生成模型:rails generate model User name:string email:string
上述命令会在 app/models
目录下生成一个 user.rb
文件,并在 db/migrate
目录下生成一个迁移文件,用于创建数据库表。name:string
和 email:string
表示 User
模型有两个属性,name
和 email
,数据类型都是字符串。
- 模型代码示例:打开
app/models/user.rb
文件,内容大致如下:class User < ApplicationRecord end
ApplicationRecord
是所有应用程序模型的基类,继承自 ActiveRecord::Base
。可以在这个类中定义各种方法,如验证、关联等。
- 数据库迁移:迁移是 Rails 用于管理数据库结构变化的机制。在生成模型后,需要运行迁移来创建实际的数据库表。使用以下命令运行迁移:
rails db:migrate
迁移成功后,数据库中会创建一个名为 users
的表,包含 name
和 email
两个字段。
- 模型验证:为了确保数据的完整性,可以在模型中添加验证。例如,要确保
name
和email
字段不能为空,可以在user.rb
文件中添加以下代码:class User < ApplicationRecord validates :name, presence: true validates :email, presence: true, format: { with: /\A[\w+\-.]+@[a - z\d\-.]+\.[a - z]+\z/i } end
上述代码中,validates :name, presence: true
表示 name
字段必须存在,validates :email, presence: true, format: { with: /\A[\w+\-.]+@[a - z\d\-.]+\.[a - z]+\z/i }
表示 email
字段必须存在且符合电子邮件格式。
五、Rails 中的控制器(Controller)
-
控制器的作用:控制器在 Rails 应用程序中扮演着中间人的角色,它接收来自客户端(通常是浏览器)的 HTTP 请求,处理请求相关的业务逻辑,调用模型获取或操作数据,然后选择合适的视图来呈现响应。
-
创建控制器:假设我们要创建一个名为
UsersController
的控制器,用于处理与用户相关的请求。可以使用以下命令生成控制器:rails generate controller Users
这将在 app/controllers
目录下生成一个 users_controller.rb
文件,并在 app/views
目录下创建一个 users
子目录,用于存放与 UsersController
相关的视图文件。
- 控制器代码示例:打开
app/controllers/users_controller.rb
文件,初始内容如下:class UsersController < ApplicationController end
ApplicationController
是所有应用程序控制器的基类,它提供了一些通用的功能和方法。我们可以在 UsersController
类中定义各种动作(action)方法,每个方法对应一个特定的 HTTP 请求。
例如,要定义一个 index
动作,用于显示所有用户列表,可以添加以下代码:
class UsersController < ApplicationController
def index
@users = User.all
end
end
在上述代码中,User.all
从数据库中获取所有的 User
记录,并将其赋值给实例变量 @users
。这个实例变量可以在对应的视图中使用。
六、Rails 中的视图(View)
-
视图的概念:视图负责将应用程序的数据呈现给用户。在 Rails 中,视图通常是使用 ERB(Embedded Ruby)模板编写的 HTML 文件,ERB 允许在 HTML 中嵌入 Ruby 代码,以便动态生成内容。
-
创建视图:对于
UsersController
的index
动作,需要在app/views/users
目录下创建一个index.html.erb
文件。 -
视图代码示例:在
index.html.erb
文件中,可以编写如下代码来显示用户列表:<h1>User List</h1> <ul> <% @users.each do |user| %> <li><%= user.name %> - <%= user.email %></li> <% end %> </ul>
上述代码中,<h1>User List</h1>
是一个 HTML 标题,<ul>
和 </ul>
之间使用 ERB 循环遍历 @users
实例变量,为每个用户生成一个列表项,显示用户的 name
和 email
。
七、路由(Routing)
-
路由的作用:路由在 Rails 应用程序中负责将传入的 HTTP 请求映射到相应的控制器动作。它定义了应用程序的 URL 结构,并决定了如何处理不同的请求。
-
路由定义:Rails 的路由定义在
config/routes.rb
文件中。例如,要将根路径(/
)映射到UsersController
的index
动作,可以在routes.rb
文件中添加以下代码:Rails.application.routes.draw do root 'users#index' end
上述代码中,root
表示根路径,users#index
表示 UsersController
中的 index
动作。
- 资源路由:Rails 提供了一种便捷的方式来定义 RESTful 风格的路由,称为资源路由。对于
User
模型,可以使用以下代码定义资源路由:Rails.application.routes.draw do resources :users end
这将自动为 User
模型生成一系列标准的 RESTful 路由,包括 index
(列出所有用户)、show
(显示单个用户)、new
(创建新用户表单)、create
(创建新用户)、edit
(编辑用户表单)、update
(更新用户)和 destroy
(删除用户)等动作对应的路由。
八、数据库操作
-
数据库查询:在 Rails 中,可以使用
ActiveRecord
提供的方法进行数据库查询。例如,要获取所有用户,可以使用User.all
。要获取满足特定条件的用户,可以使用where
方法,如User.where(name: 'John')
获取名字为John
的用户。 -
创建记录:可以使用
create
方法创建新的数据库记录。例如:user = User.create(name: 'Jane', email: 'jane@example.com')
上述代码创建了一个新的 User
记录,并将其保存到数据库中。
- 更新记录:要更新数据库中的记录,可以先获取记录,然后修改其属性并保存。例如:
user = User.find(1) user.name = 'Updated Name' user.save
上述代码获取 id
为 1 的用户记录,修改其 name
属性,并保存更新。
- 删除记录:使用
destroy
方法删除数据库记录。例如:user = User.find(1) user.destroy
上述代码获取 id
为 1 的用户记录并将其从数据库中删除。
九、表单处理
- 生成表单:在 Rails 中,可以使用
form_with
辅助方法生成 HTML 表单。例如,在app/views/users/new.html.erb
文件中,可以编写如下代码生成创建用户的表单:<%= form_with(model: @user, local: true) do |form| %> <div> <%= form.label :name %> <%= form.text_field :name %> </div> <div> <%= form.label :email %> <%= form.text_field :email %> </div> <%= form.submit %> <% end %>
上述代码中,form_with(model: @user, local: true)
表示表单基于 @user
模型,local: true
表示表单提交是本地提交,不进行 AJAX 提交。form.label
生成表单标签,form.text_field
生成文本输入框,form.submit
生成提交按钮。
- 处理表单提交:在
UsersController
中,需要定义create
动作来处理表单提交。例如:class UsersController < ApplicationController def create @user = User.new(user_params) if @user.save redirect_to users_path, notice: 'User was successfully created.' else render :new end end private def user_params params.require(:user).permit(:name, :email) end end
在上述代码中,user_params
方法使用 params.require(:user).permit(:name, :email)
来获取并允许 name
和 email
参数,防止参数注入攻击。@user = User.new(user_params)
创建一个新的 User
实例,@user.save
尝试将其保存到数据库。如果保存成功,重定向到用户列表页面并显示成功通知;如果保存失败,重新渲染 new
视图。
十、Rails 中的布局与视图助手
- 布局(Layout):布局是一种模板,用于定义应用程序的整体结构和外观。Rails 默认使用
app/views/layouts/application.html.erb
作为应用程序的布局文件。在布局文件中,可以包含 HTML 头部、导航栏、页脚等通用部分,以及一个yield
方法,用于插入具体视图的内容。
例如,application.html.erb
文件可能如下:
<!DOCTYPE html>
<html>
<head>
<title>My App</title>
<%= csrf_meta_tags %>
<%= csp_meta_tag %>
<%= stylesheet_link_tag 'application', media: 'all', 'data - turbolinks - track': 'reload' %>
<%= javascript_pack_tag 'application', 'data - turbolinks - track': 'reload' %>
</head>
<body>
<header>
<nav>
<!-- 导航栏内容 -->
</nav>
</header>
<%= yield %>
<footer>
<!-- 页脚内容 -->
</footer>
</body>
</html>
上述代码中,<%= yield %>
位置会被具体视图的内容替换。
- 视图助手(Helpers):视图助手是一些方法,用于在视图中生成常用的 HTML 代码片段或执行一些辅助任务。例如,
link_to
助手用于生成链接,image_tag
助手用于生成图片标签等。
例如,要生成一个指向用户详情页面的链接,可以在视图中使用以下代码:
<%= link_to user.name, user_path(user) %>
上述代码中,link_to
方法的第一个参数是链接显示的文本,第二个参数是链接的目标路径,user_path(user)
是 Rails 根据资源路由自动生成的路径,指向特定用户的详情页面。
十一、Rails 中的测试
-
测试的重要性:测试是软件开发过程中不可或缺的一部分,它可以帮助确保代码的正确性、稳定性和可维护性。Rails 提供了一套丰富的测试框架,包括单元测试、功能测试和集成测试等,方便开发人员为应用程序编写测试用例。
-
单元测试:单元测试主要用于测试模型和控制器的单个方法。以
User
模型为例,Rails 会在test/models
目录下生成一个user_test.rb
文件。可以在这个文件中编写测试用例,例如:require 'test_helper' class UserTest < ActiveSupport::TestCase test 'name should be present' do user = User.new(email: 'test@example.com') assert_not user.valid? assert user.errors[:name].any? end test 'email should be valid' do user = User.new(name: 'Test User', email: 'invalid - email') assert_not user.valid? assert user.errors[:email].any? end end
上述代码中,test 'name should be present'
测试了 name
字段必须存在的验证逻辑,test 'email should be valid'
测试了 email
字段的格式验证逻辑。
- 功能测试:功能测试用于测试控制器的动作和视图的渲染。以
UsersController
为例,Rails 会在test/controllers
目录下生成一个users_controller_test.rb
文件。可以编写如下测试用例:require 'test_helper' class UsersControllerTest < ActionDispatch::IntegrationTest test 'should get index' do get users_path assert_response :success end test 'should create user' do assert_difference('User.count') do post users_path, params: { user: { name: 'New User', email: 'new@example.com' } } end assert_redirected_to users_path end end
上述代码中,test 'should get index'
测试了 index
动作能否成功响应,test 'should create user'
测试了创建用户的功能,包括检查用户数量是否增加以及是否重定向到正确的路径。
- 集成测试:集成测试用于测试多个组件之间的交互,例如模型、控制器和视图之间的协作。Rails 提供了
ActionDispatch::IntegrationTest
类来编写集成测试。例如,可以编写测试用例来模拟用户在浏览器中的操作流程,测试整个应用程序的功能是否正常。
十二、部署 Rails 应用程序
-
选择部署平台:常见的 Rails 应用程序部署平台有 Heroku、AWS Elastic Beanstalk、DigitalOcean 等。这里以 Heroku 为例进行介绍。
-
准备部署:在部署之前,需要确保应用程序在本地运行正常,并且所有依赖项都已正确配置。在
Gemfile
文件中,确保列出了所有必要的 gems,并且运行bundle install
安装这些依赖项。 -
部署到 Heroku:
- 首先,需要在 Heroku 官网创建一个账户,并安装 Heroku CLI。
- 登录 Heroku CLI:
heroku login
- 在 Rails 应用程序目录下,初始化 Git 仓库(如果尚未初始化):
git init git add. git commit - m "Initial commit"
- 创建一个 Heroku 应用:
heroku create
- 将代码推送到 Heroku:
git push heroku master
- 运行数据库迁移:
heroku run rails db:migrate
- 打开应用:
heroku open
通过以上步骤,就可以将 Rails 应用程序部署到 Heroku 平台上,并通过 Heroku 提供的 URL 访问应用程序。
通过以上对 Ruby on Rails 框架各个方面的介绍,相信你已经对如何使用 Rails 开发 Web 应用程序有了较为全面的了解。在实际开发中,还可以进一步探索 Rails 的更多高级特性,如 Action Cable 实现实时通信、ActiveJob 进行异步任务处理等,以构建更强大、高效的 Web 应用程序。