ruby-on-rails - 如何在 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)。
对于如何以更好的方式进行此检查的任何评论或帮助,我将不胜感激。
解决方案
而不是做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
) 返回,否则返回。true
false
要进一步区分验证失败的类型,您可以使用#added?
:
user.errors.added? :email, :taken
=> 如果电子邮件唯一性错误,则为 true
user.errors.added? :email, :invalid
=> 如果电子邮件格式错误,则为 true。
推荐阅读
- regex - Bash,需要在多个目录中更改词序
- php - 如何根据另一个多维排除数组过滤多维数组?
- angular - 如何将相同的组件视为同一父级[Angular]中的两个不同组件
- reactjs - 如何在 React Native 中使用 React Native Video 显示多个视频?
- python - 扫描字符串文字时出现语法错误'EOL (
,第 9 行)' - laravel - Laravel更新雄辩不更新记录
- spring - 没有可用于当前线程的具有实际事务的 EntityManager:多个配置 xml 文件
- java - 使用 powershell 创建防火墙规则
- r-exams - 添加跳过/未评分的开放式问题
- sql - 具有多个条件的 SQLite CASE 查询