Rails 7 开发总结(下)

1. 在 Controller 中操作数据

数据库中的每一行都是一个 ActiveRecord 对象,通过对象自带的方法进行 CRUD。每一列是当前对象的属性。

1.1 新增

ruby 复制代码
user = User.new # 新建
user.email = '1@x.com'
user.password = 'x'

user = User.new(email: '1@x.com', password: 'x') # 上面简化为这一句
user.save # 保存到数据库
user.errors # 保存失败

user = User.create(email: '1@x.com', password: 'x') # 新建+保存

# 使用params.permit(:email, :password)从params中选定字段
user = User.new(params.permit(:email, :password))
user.save

user = User.create(params.permit(:email, :password))

1.2 查询

bash 复制代码
users = User.all

users = User.where(email: '1@x.com') # 查找邮箱为...

users = User.where.not(email: '1@x.com') # 查找邮箱不为...

users = User.all.limit(3).order(created_at: :asc) # 获取前三个按创建时间升序排列的用户数据

1.3 更新

ruby 复制代码
user = User.find_by(email: params[:email])
if user
  user.email = params[:email]
  user.save
end

# 或者直接调用 update 方法更新
user.update(email: params[:email])

1.4 删除

ruby 复制代码
user = User.find(params[:id])
if user
  user.destroy
end

2. Model 数据验证

在存入数据库前对资源字段进行验证,如果验证失败就不会存进去。

ruby 复制代码
class User < ApplicationRecord
  has_secure_password # 内置的宏命令
  
  # 存入数据前校验email:必填、唯一、格式
  validates :email, presence: true, uniqueness: true, format: {with: /\A.+@.+\z/}
end

has_secure_password 是Rails中内置的宏命令,自动添加特性:密码的验证和加密。

3. 返回 json 数据

3.1 基本用法

ruby 复制代码
user = User.new(params.permit(:email, :password))
if user.save
  # 保存成功,返回 json 数据、HTTP 状态码
else
  # 保存失败(如字段验证失败),错误以列表形式保存在 user.errors.full_messages
end

3.2 HTTP 状态码

Ruby符号 HTTP状态码 描述
:ok 200 OK 成功处理了请求的标准响应。
:created 201 Created 请求已经被实现,而且有一个新的资源已经依据请求的需要而建立。
:accepted 202 Accepted 请求已被接受用于处理,处理并未完成。
:no_content 204 No Content 服务器成功处理了请求,但没有返回任何内容。
:moved_permanently 301 Moved Permanently 请求的URL已移走。
:found 302 Found 临时的响应会经常变动,如会换一个URL。
:bad_request 400 Bad Request 服务器不理解请求的语法。
:unauthorized 401 Unauthorized 请求要求用户的身份认证。
:forbidden 403 Forbidden 服务器理解请求客户端的请求,但是拒绝执行此请求。
:not_found 404 Not Found 服务器无法根据客户端的请求找到资源。
:unprocessable_entity 422 Unprocessable Entity 请求格式正确,但是由于含有语义错误,无法响应。
:too_many_requests 429 Too Many Requests 用户在给定的时间内发送了太多的请求。
:internal_server_error 500 Internal Server Error 服务器内部错误,无法完成请求。

3.3 实例

ruby 复制代码
class Api::V1::UsersController < ApplicationController
	# 注册
	def create
	  user = User.new(user_params)
	  if user.save
	    render json: {
	      status: 'success',
	      message: '注册成功',
	    }, status: :created # 201
	  else
	    render json: {
	      status: 'failure',
	      message: user.errors.full_messages.join(', ')
	    }, status: :unprocessable_entity # 422
	  end
	end
	
	private
  def user_params
    params.permit(:email, :password, :password_confirmation)
  end
end

private 用于定义类的私有方法,只能在类内部使用。

4. 数据序列化

在数据库中查到的数据默认是所有的属性都会被返回出来的,通过序列化器返回指定属性。

4.1 依赖安装

在 Gemfile 中添加:

ruby 复制代码
gem 'active_model_serializers'

执行 bundle install 安装依赖。

4.2 创建序列化器

bash 复制代码
rails g serializer User

在 app/serializers 下生成 user_serializer.rb:

ruby 复制代码
class UserSerializer < ActiveModel::Serializer
  attributes :id, :email, :name, :address, :phone
end

4.3 全局序列化方法封装

controller 目录下有一个 application_controller.rb,在这里可以共享方法和行为。

ruby 复制代码
# 序列化
def serialize_resource(resource)
  ActiveModelSerializers::SerializableResource.new(resource).as_json
end

4.4 返回 json 时使用序列化器

ruby 复制代码
def index
	apples = Apple.not_deleted.all
	return render json: {
		status: 'sucess',
		message: '获取成功',
		data: serialize_resource(apples)
	}, status: :ok
end

4.5 as_json

简单的序列话可以用 as_json 方法代替。

ruby 复制代码
user = User.find(1)
user.as_json(only: [:id, :email, :name, :address, :phone])

5. 软删除

软删除不是真正的删除,是对记录做一个标记。

5.1 定义

ruby 复制代码
class Apple < ApplicationRecord
  # 自定义范围,返回未被删除的记录
  scope :not_deleted, -> { where(deleted_at: nil) }

	# 多个字段必填
  validates_presence_of :name, :price, :discount, :tag

  # 可以通过 apple.soft_delete 来软删除一个 apple 对象
  def soft_delete
    update(deleted_at: Time.current)
  end
  
  # 过滤掉 delete_at 属性
  def as_filtered_json
    self.as_json(except: [:deleted_at])
  end
end

5.2 使用

在 Controller 中使用。

Apple.not_deleted 等价于 Apple.where(deleted_at: nil)

ruby 复制代码
# 获取所有未删除的数据
apples = Apple.not_deleted.all

软删除的使用:

ruby 复制代码
apple = Apple.find(id)
apple.soft_delete # 执行软删除

6. CORS

解决跨域问题。

6.1 安装依赖

在 Gemfile 中添加:

ruby 复制代码
gem "rack-cors"

执行 bundle install 安装依赖。

6.2 配置 CORS

然后在 config/initializers/cors.rb 中添加代码:

ruby 复制代码
Rails.application.config.middleware.insert_before 0, Rack::Cors do
  allow do
    origins {true}
    resource '*',
        methods: [:get, :post, :delete, :patch, :options, :head],
        headers: :any,
        expose: ['*', 'Authorization'],
        max_age: 600
  end
end

技术交流:

  • 公众号:见嘉 Being Dev

  • v:with_his_x

相关推荐
凡人的AI工具箱2 小时前
AI教你学Python 第11天 : 局部变量与全局变量
开发语言·人工智能·后端·python
是店小二呀2 小时前
【C++】C++ STL探索:Priority Queue与仿函数的深入解析
开发语言·c++·后端
canonical_entropy2 小时前
金蝶云苍穹的Extension与Nop平台的Delta的区别
后端·低代码·架构
我叫啥都行3 小时前
计算机基础知识复习9.7
运维·服务器·网络·笔记·后端
无名指的等待7123 小时前
SpringBoot中使用ElasticSearch
java·spring boot·后端
.生产的驴4 小时前
SpringBoot 消息队列RabbitMQ 消费者确认机制 失败重试机制
java·spring boot·分布式·后端·rabbitmq·java-rabbitmq
AskHarries4 小时前
Spring Boot利用dag加速Spring beans初始化
java·spring boot·后端
苹果酱05675 小时前
一文读懂SpringCLoud
java·开发语言·spring boot·后端·中间件
掐指一算乀缺钱5 小时前
SpringBoot 数据库表结构文档生成
java·数据库·spring boot·后端·spring
计算机学姐7 小时前
基于python+django+vue的影视推荐系统
开发语言·vue.js·后端·python·mysql·django·intellij-idea