Rails 设计实现登录验证功能

357 阅读5分钟

1.验证码

稍微学习一下rails 的分页器是怎么实现的,菜鸟上路

设计:

  • 资源:validation_code
  • 动作: POST
  • 状态码 200 成功 | 201 | 422 格式有问题 | 429 太频繁

2.登入登出

登入了,就是创建一个session(会话)

  • 资源: session

  • 动作: create | destroy

  • 状态码 200 | 422 (成功/失败)

3.当前用户

  • 资源:me
  • 动作: show

4.数据

  • 资源: items
  • 动作: 增删改查

创建路由

config/routes.rb

Rails.application.routes.draw do
  namespace :api do
    namespace :v1 do
      #/api/v1
      resources :validation_codes, only: [:create]
    end
  end
end

上面这段代码,定义了一个路由,用于处理 API 的请求。具体来说,它定义了一个命名空间 api,在该命名空间下,又定义了一个子命名空间 v1。在 v1 命名空间下,定义了一个 validation_codes 的资源路由,只允许 create 操作。

我的问题1: 上面代码中的 ' : ' 符号是什么意思???

  • 在 Ruby 中,以冒号 : 开头的符号通常称为符号(Symbol)。符号在 Ruby 中类似于字符串,但是它们是不可变的,也就是说,每个符号只会在内存中保存一份副本,不管它在代码中出现了多少次。与字符串相比,符号的创建和比较速度更快,因此在某些情况下,使用符号可以提高程序的性能。
  • 在 Rails 路由中,使用符号作为参数,通常用来表示控制器、动作或路由名称等。例如,:articles 表示文章资源,:create 表示创建操作,:id 表示资源的标识符等。通过使用符号作为参数,Rails 可以更方便地将路由和控制器动作等元素进行匹配和生成 URL。

我的问题2: create是什么??

create 代表创建资源,除了 create,在 Rails 中常见的资源操作还包括:

  • index:获取资源列表;
  • show:获取单个资源的详情;
  • edit:显示修改资源的表单;
  • update:提交修改后的资源;
  • destroy:删除资源。

通常情况下,资源路由会支持多个操作,开发者可以根据业务需求自行选择需要的操作。在 Rails 中,可以使用 only 或 except 来限制或排除某些操作,例如:

resources :users, only: [:index, :show, :create, :update]
resources :articles, except: [:destroy]

这样定义路由后,users 资源只支持列出、显示、创建和更新操作,而 articles 资源则支持除删除外的所有操作。

根据设计,列出所有路由

Rails.application.routes.draw do
  namespace :api do
    namespace :v1 do
      #/api/v1
      resources :validation_codes, only: [:create]
      resources :session, only: [:create, :destroy]
      resources :me, only: [:show]
      resources :items
      resources :tags
    end
  end
end

生成模型

bin/rails g model ValidationCode email:string kind:string used_at:datetime
  • 这个命令会在app/models目录中创建一个名为validation_code.rb的新模型文件,该模型包含三个属性:email(字符串类型)、kind(字符串类型)和used_at(日期时间类型)。bin/rails命令是Rails命令行工具的调用方式,而g则是generate的简写。
  • 因此,这个完整的命令会创建一个名为ValidationCode的新模型,包含emailkindused_at三个属性。其中,email属性将存储一个字符串,表示电子邮件地址;kind属性将存储一个字符串,表示验证代码的类型;used_at属性将存储一个日期时间,表示代码何时被使用(如果已被使用)。

那么什么是模型呢?

  • 模型就是一个类,类中包含各种属性,举个例子,假设我们需要一个User模型来管理用户信息。User中包含各种属性,例如nameemail,以及各种方法,例如createupdate等。同时,我们可以使用验证器(Validator)来验证数据的有效性,以确保数据的正确性和完整性。
  • 当我们在控制器(Controller)中需要访问和操作用户数据时,我们可以通过User模型来实现。例如,我们可以使用User.create方法来创建一个新用户,并将其存储到数据库中。这个过程中,Rails框架会自动将我们的操作转化为对数据库的操作,从而实现了ORM的效果。

那么为什么Rails框架会自动将我们的操作转化为对数据库的操作呢?

在模型中,我们可以使用各种方法来读取、创建、更新、删除数据库中的数据,而这些方法实际上都是在执行SQL语句,从而与数据库进行交互。这些SQL语句的生成是由Rails框架中的Active Record库自动完成的,我们只需要按照一定的规范来编写模型代码即可。

生成控制器

这是在Rails应用程序中生成一个名为ItemsController的控制器,命名空间为Api::V1。该控制器将在app/controllers/api/v1/items_controller.rb中创建,并为其生成路由,允许您执行各种操作,例如创建、读取、更新和删除(CRUD)相关项目的操作。

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

会生成两个文件,看第一个

class Api::V1::ItemsController < ApplicationController
  def index
  end

  def creact
  end
end

完成控制器

引入kaminari的ruby gem

gem 'kaminari'
bundle install

以下为代码

class Api::V1::ItemsController < ApplicationController
  # swager文档代码
  include Swagger::Blocks
  swagger_path "/api/v1/items" do
    operation :post do
    end
  end
  swagger_path "/api/v1/items" do
    operation :get do
      key :description, "查询"
    end
  end
# get请求代码
  def index
#定义items,拿到参数,使用Item.page方法将返回结果赋值给items,然后返回items
    items = Item.page(params[:page] || 1 ).per(params[:page_size] || 10)
    render json: { resource: items ,pager:{
      page:params[:page],
      page_no:params[:page_size],
      count:Item.count,

    }}
  end

  def create
    # Item.new 一个新的对象,并将amount赋值为1,这个对象赋值给item,最后将item数据save到数据库中,并返回结果.
    
    item = Item.new amount: 1
    if item.save
      render json: { resource: item }
    else
      render json: { errors: item.errors }
    end
  end
end

结果

使用api fox 验证

成功