1. MVC
Rails 采用 MVC 架构
MVC 部分引用于:ihower.tw/rails/basic…
- 瀏覽器發出HTTP request請求給Rails
- 路由(Routing)根據規則決定派往哪一個Controller的Action
- 負責處理的Controller Action操作Model資料
- Model存取資料庫或資料處理
- Controller Action將得到的資料餵給View樣板
- 回傳最後的HTML成品給瀏覽器
2. 创建 API 服务
以 PostgreSQL 为数据库,创建一个API服务。
rails new --api --database=postgresql --skip-test x-api
3. 使用 Docker 创建数据库
docker run -d --name db-for-rb # 容器名称/DB_HOST
-e POSTGRES_USER=root # 用户名
-e POSTGRES_PASSWORD=123456 # 密码
-e POSTGRES_DB=rb_dev # 数据库
-e PGDATA=/var/lib/postgresql/data/pgdata # 指定数据存储目录
-v rb-data:/var/lib/postgresql/data # 数据卷(数据持久化)
-p 5434:5432 # 端口映射(本机的5434映射到容器中的5432)
--network=network2 # 网络,用于服务桥接
postgres:14 # 镜像:版本
在 PostgreSQL 中,PGDATA 是一个环境变量,用于指定数据库引擎存储数据的目录路径。在这个命令中,将 PGDATA 设置为 /var/lib/postgresql/data/pgdata
,这意味着 PostgreSQL 容器将使用容器内的 /var/lib/postgresql/data/pgdata
目录作为数据存储目录。
持久化的数据(rb-data)在 docker 的 Volumes 中可以看到:
4. 配置 config/database.yml
development:
<<: *default
database: rb_dev
username: root
password: 123456
host: localhost
port: 5434
production:
<<: *default
database: rb_production
username: root
password: <%= ENV["DB_PASSWORD"] %>
host: <%= ENV["DB_HOST"] %>
生产环境的password和host从环境变量中读取,环境变量一般保存在.bashrc中。
5. 启动服务
运行服务器后,可以启动 Rails 服务了。
rails s
6. 创建路由
6.1 设计路由
在config/routes.rb中设计路由,例如:/api/v1/
Rails.application.routes.draw do
namespace :api do
namespace :v1 do
post '/auth_codes', to: 'auth_codes#create'
resources :users
get '/me', to: 'users#me'
post '/login', to: 'users#login'
resources :posts, only: [:index, :show, :create, :update, :destroy]
resources :comments
patch '/update_multiple', to: 'comments#update_multiple'
resources :likes, only: [:create, :destroy]
end
end
end
- index:GET 检索所有资源
- show:GET 检索某一个
- create:POST 创建新资源
- update:PATCH 更新资源
- destroy:DELETE 删除资源
6.2 生成路由
然后,根据config/routes.rb生成路由:
rails routes
7. 数据库操作
7.1 创建数据库
rails db:create
rails db:create RAILS_ENV=production # 生产环境
7.2 迁移数据库
rails db:migrate
7.3 回滚数据库
rails db:rollback
8. 数据库模型
8.1 创建数据表
每个模型代表一张表,下面迁移后会产生 users 表。
rails g model User name:string email:string
更多的字段可以在迁移文件中添加或修改,完成后运行 rails db:migrate
完成迁移。
8.2 迁移文件中的常用操作
- 创建表
class CreateUsers < ActiveRecord::Migration[7.0]
def change
# 创建表
create_table :users, id: :uuid do |t| # id 为 uuid,默认为自增
t.string :email
t.string :password_digest
t.string :name, default: '默认名称' # 默认值
t.datetime :deleted_at, null: true # 是否可以为空
t.timestamps
end
end
end
- 其他操作记录在此
add_column :users, :username, :string # 添加新列
rename_column :users, :password_digest, :encrypted_password # 更改列中名称
remove_column :users, :encrypted_password # 删除一列
change_column :users, :email, :text # 更改字段 email 类型
rename_table :users, :accounts # 更改表的名称
add_index :users, :email, unique: true # 对一个或多个列添加唯一索引
change_column_null :users, :email, false # 更改一个列是否可以为空
change_column_default :users, :name, from: '默认名称', to: 'new default' # 更改默认值
add_reference :posts, :user, foreign_key: true # 添加或删除外键引用
以上操作可写在迁移文件的 change、up、down方法下。
8.3 执行迁移命令
编写完成后,需要执行迁移命令,更新数据库。
rails db:migrate
注意:如果迁移完成后想对现存字段做修改,需要重新生成一个迁移文件。
9. 控制器
利用用户的请求方法+路由,进入到对应的控制器中。
9.1 创建控制器
rails g controller api/v1/user_controller
9.2 编写控制器
class Api::V1::UsersController < ApplicationController
def create
# ...
end
def index
# ...
end
def show
# ...
end
def update
# ...
end
def destroy
# ...
end
def me
# ...
end
def login
# ...
end
end
10. 密钥管理
10.1 编辑密钥
EDITOR="code --wait" rails credentials:edit # 开发环境
EDITOR="code --wait" rails credentials:edit --environment production # 生产环境
在打开的文档中编辑密钥。
10.2 查看密钥
- 打开控制台
rails c # 开发环境
RAILS_ENV=production rails c # 生产环境
- 查看密钥配置
Rails.application.credentials.config
11. 删除记录
11.1 使用控制台删除
rails c
User.destroy_all # 删除所有记录
User.count # 查看数量
11.2 使用 Postgres 命令
DELETE FROM users;
DELETE FROM users WHERE id = 1;
12. VSCode SQL插件推荐
SQLTools + SQLTools PostgreSQL/Cockroach Driver