当我在 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 中更新用户模型时会发生回滚?的主要内容,如果未能解决你的问题,请参考以下文章
在 Windows 中,当我在 Windows 资源管理器中双击一个文件时会发生啥?
Rails omniauth Google - 如何更新个人资料数据