在 Rails 中保存记录时抑制错误
Posted
技术标签:
【中文标题】在 Rails 中保存记录时抑制错误【英文标题】:Suppress an error when saving a record in Rails 【发布时间】:2015-02-27 10:12:46 【问题描述】:我正在将数据保存到表中。
Question
title:string
author_id:integer
description:text
upvotes:integer
如果“question.upvotes”的值为1000000000000000000000,则会导致错误,因为它无法保存到“整数”类型列中。
如何抑制此错误?我希望我的程序继续运行,即使记录保存失败。
我试过了,但它并没有抑制错误:
... some code
if my_question.save
end
some more code...
【问题讨论】:
会导致什么错误?更新失败时你会看到什么? 你看过documentation forsave
吗?
@NielsAbildgaard 这可能是一个处理 try / catch 语法的一般 Ruby 问题,而不是特定于活动记录 .save 方法
错误是PG::NumericValueOutOfRange: ERROR: value "1000000000000" is out of range for type integer
或者您可以只测试该值以查看它是否不会保存。也就是说,默默地未能满足用户的期望,也许其他程序员的期望不是一个好的通用设计原则。
【参考方案1】:
... some code
begin
if my_question.save
...
end
rescue
# error handling
end
some more code ...
您收到ActiveRecord::StatementInvalid: PG::NumericValueOutOfRange: ERROR: integer out of range
错误。如果你想准确地捕捉到这个错误,你可以直接指定这个:
rescue ActiveRecord::StatementInvalid
您也可以添加一个将始终执行的块
ensure
You can find more about exceptions handling here/And see exceptions hierarchy here
【讨论】:
在 Rails 5.2 中ActiveModel::RangeError
被提升。伙计,这让救援逻辑变得脆弱。【参考方案2】:
也许只是将该值固定为最大可能值?将这样的内容添加到您的 Question
模型中:
# app/models/question.rb
UPVOTE_MAX_VALUE = 2_147_483_647 # integer max value in postgresql
before_validation :check_upvote_max_size
private
def check_upvotes_max_size
self.upvotes = UPVOTE_MAX_VALUE if upvotes > UPVOTE_MAX_VALUE
end
【讨论】:
以上是关于在 Rails 中保存记录时抑制错误的主要内容,如果未能解决你的问题,请参考以下文章
在测试者的设备上部署应用程序无法在 iCloud 中保存记录