首页 > 解决方案 > 如何在 Rails 5 中验证相同操作的不同 ActiveRecord

问题描述

我正在 Rails5 中构建身份验证系统,并且我有一个用户,我想检查其电子邮件字段的唯一性和正确格式。我已经看到这两个错误都引发了相同的异常,ActiveRecord::RecordInvalid,我想知道如何以一种良好而优雅的方式管理这两种情况。

这将是我的模型用户的重要部分:

validates_format_of :email, with: URI::MailTo::EMAIL_REGEXP
validates_presence_of :email
validates_uniqueness_of :email

这将是控制器:

begin
  user.save!
  render status: :created, json: { msg: 'User was created.' }
rescue ActiveRecord::RecordInvalid => err
  render status: conflict, json: { msg: err }
end

我想做的是区分唯一性错误(返回 409)和格式错误(返回 400)。

对于如何以更好的方式进行此检查的任何评论或帮助,我将不胜感激。

标签: ruby-on-railsvalidationapi-design

解决方案


而不是做user.save!,处理user.save

if user.save
  render status: :created, json: { msg: 'User was created.' }
else
  render status: conflict, json: { msg: user.errors.full_messages.join(', ') }
end

如果对象因某种原因未保存,则 bang 版本 ( ) 会引发异常,而如果对象已保存save!,则非 bang 版本 ( save) 返回,否则返回。truefalse

要进一步区分验证失败的类型,您可以使用#added?

user.errors.added? :email, :taken=> 如果电子邮件唯一性错误,则为 true

user.errors.added? :email, :invalid=> 如果电子邮件格式错误,则为 true。


推荐阅读