当我在 Rails 中更新用户模型时会发生回滚?

Posted

技术标签:

【中文标题】当我在 Rails 中更新用户模型时会发生回滚?【英文标题】:Rollback happens when I update user model in Rails? 【发布时间】:2022-01-17 10:11:39 【问题描述】:

当我尝试更新用户简历时,rails 回滚。

这是我的控制器:

class UsersController < ApplicationController
skip_before_action :authorize, only: [:create]

def create
    user = User.create!(user_params)
    session[:user_id] = user.id
    render json: user, status: :created
end

def show
    render json: @current_user, include: :animes
end

def update
    user = User.find_by(id: params[:id])
    user.update(user_params)
    render json: user, status: :ok
end

private

def user_params
    params.require(:user).permit(:username, :password, :password_confirmation, :bio, :avatar, :email)
end

这是我的模型:

class User < ApplicationRecord
has_secure_password
has_many :anime_lists
has_many :animes, through: :anime_lists
has_many :manga_lists
has_many :mangas, through: :manga_lists

validates :username, presence: true, confirmation: 
case_sensitive: false, uniqueness: true, length: in: 6..30
end

这是控制台的图片:Rails console

我什至用更新的 bio 取回了前端的响应对象,但实际上并没有更新。

为什么会这样?

【问题讨论】:

我们需要检查您的型号。如果您在那里有验证,它可以拒绝您的更新。一个好的做法是使用 Flash 消息在视图中显示有关成功更新或错误的答案。 @PauloFelipeSouza 为我的模型添加了代码。是不是我的用户名对于长度要求来说太短了,因此它正在回滚?另外我没有使用视图,我的 rails 后端是一个 API。更新:我尝试使用不同的帐户,它可以工作,所以你是对的,它一定是一个验证问题。 检查是否更新... if user.update(user_params) render json: user, status: :ok else render json: user.errors.full_messages, status: :400 end 【参考方案1】:

事务中的SELECT 1 ... 查询看起来像检查唯一性的查询。事实上,您的模型有一个uniqueness validation。如果在这个查询之后没有插入数据,那么这个验证很有可能会失败,因此 Rails 会回滚在这个 save 操作的概念中完成的所有事情。

这意味着您尝试使用数据库中已存在的用户名创建用户。

要准确了解什么时候出错并为用户提供反馈,我建议将验证错误返回给用户。这可以通过将控制器方法更改为:

def update
  user = User.find_by(id: params[:id])
  
  if user.update(user_params)
    render json: user, status: :ok
  else
    render json: user.errors, status: :unprocessable_entity
  end
end

【讨论】:

【参考方案2】:

我们需要检查您的型号。如果您在那里有验证,它可以拒绝您的更新。一个好的做法是使用 Flash 消息在视图中显示有关成功更新或错误的答案。

【讨论】:

以上是关于当我在 Rails 中更新用户模型时会发生回滚?的主要内容,如果未能解决你的问题,请参考以下文章

当我在严格的客户端集合上调用更新/插入时会发生啥?

Rails设计不会重定向到根路径

在 Windows 中,当我在 Windows 资源管理器中双击一个文件时会发生啥?

Rails omniauth Google - 如何更新个人资料数据

FriendlyID 历史记录不适用于 Rails 中更新的模型 url

当我的镜像的基础镜像更新时会发生啥?