实战篇笔记-山竹记账后端(二)


解决 Docker 依赖持久化问题

  • 哪些依赖没有持久化?
    ruby 的 gems 没有持久化
    archlinux 的 postgresql-libs 没有持久化

  • 如何解决
    使用 mount 参数和 Dockerfile 的 RUN 指令来解决

    • 使用 mount 参数
      .devcontainer/devcontainer.json
      添加 “source=gems,target=/usr/local/rvm/gems,type=volume”,
      注意句尾逗号也要写
    • 使用 RUN 指令
      .devcontainer/Dockerfile
      文末添加 RUN yes | pacman -S postgresql-libs

rebuild 后要重新设置国内镜像 bundle config mirror.https://rubygems.org https://gems.ruby-china.com

REST 风格是什么

  • 看见路径就知道请求什么东西
    items - 数据
    tags - 标签
    validation_codes - 验证码

  • 看见动词就知道是什么操作
    get - 获取
    post - 创建
    patch - 更新
    delete - 删除

  • 看见状态码就知道结果是什么
    200 - 成功
    201 - 创建成功
    401 - 未登录
    402 - 需付费
    403 - 没有权限
    404 - 未找到
    412 - 不满足前提条件
    422 - 无法处理,参数有问题
    429 - 请求太频繁
    400 - 其他所有错误,详细原因可以放在 body 里

API概要设计

见课件

路由与分页

生成路由

回顾一下,前面是手写创建路由,现在来使用 Rails 提供的路由功能,Rails 路由能识别 URL,将其分发给控制器的动作进行处理,还能生成路径和 URL,无需直接在视图中硬编码字符串。

控制器命名空间和路由

# config/routes.rb
Rails.application.routes.draw do

  namespace :api do
    namespace :v1 do
      # /api/v1/xxx
      resources :validation_codes, only: [:create]
      # only: [:create] 只生成 create 接口
      resources :session, only: [:create, :destory]
      # 啊啊啊做笔记才发现这里 destroy 拼写错了所以没生成 🤦🏻‍♀
      resources :me, only: [:show]
      resources :items
      resources :tags
      end
    end
end

执行命令 bin/rails routes

会生成

POST   /api/v1/validation_codes(.:format)   api/v1/validation_codes#create
POST   /api/v1/session(.:format)            api/v1/session#create
GET    /api/v1/me/:id(.:format)             api/v1/me#show
GET    /api/v1/items(.:format)              api/v1/items#index
POST   /api/v1/items(.:format)              api/v1/items#create
GET    /api/v1/items/:id(.:format)          api/v1/items#show
PATCH  /api/v1/items/:id(.:format)          api/v1/items#update
PUT    /api/v1/items/:id(.:format)          api/v1/items#update
DELETE /api/v1/items/:id(.:format)          api/v1/items#destroy
GET    /api/v1/tags(.:format)               api/v1/tags#index
POST   /api/v1/tags(.:format)               api/v1/tags#create
GET    /api/v1/tags/:id(.:format)           api/v1/tags#show
PATCH  /api/v1/tags/:id(.:format)           api/v1/tags#update
PUT    /api/v1/tags/:id(.:format)           api/v1/tags#update
DELETE /api/v1/tags/:id(.:format)           api/v1/tags#destroy

建模

参照前面数据库建模

# 创建 ValidationCode 数据表
bin/rails g model ValidationCode email:string kind:string used_at:datetime
# 创建 item 数据表
bin/rails g model item iser_id:integer amount:integer notes:text tags_id:integer happen_at:datetime

同步到数据库 bin/rails db:migrate

创建 controller

参照前面创建 controller

bin/rails g controller Api::V1::Validation_codes create
bin/rails g controller Api::V1::Items

安装 kaminari

kaminari github

在 Gemfile 里面添加 gem 'kaminari'

终端执行 bundle

然后重启 bin/rails s

修改配置 config/initializers/kaminari_config.rb


文章作者: April-cl
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 April-cl !
  目录