Ruby on rails 在Rails中保存记录时抑制错误

Ruby on rails 在Rails中保存记录时抑制错误,ruby-on-rails,ruby,Ruby On Rails,Ruby,我正在将数据保存到表中 Question title:string author_id:integer description:text upvotes:integer 如果“question.upvoces”值为10000000000000,则会导致错误,因为无法将其保存到“integer”类型列 如何抑制此错误?我希望我的程序继续运行,即使记录未能保存。 我尝试了这个,但它不能抑制错误: ... some code if my_question.save end som

我正在将数据保存到表中

Question
  title:string
  author_id:integer
  description:text
  upvotes:integer
如果“question.upvoces”值为10000000000000,则会导致错误,因为无法将其保存到“integer”类型列

如何抑制此错误?我希望我的程序继续运行,即使记录未能保存。

我尝试了这个,但它不能抑制错误:

... some code

if my_question.save
end

some more code...
您收到
ActiveRecord::StatementInvalid:PG::NumericValueOutOfRange:ERROR:integer超出范围
ERROR。如果要准确捕获此错误,可以直接指定:

rescue ActiveRecord::StatementInvalid
此外,您还可以添加一个始终使用

ensure

/

也许只是将该值固定到可能的最大值?在您的
问题
模型中添加类似的内容:

# 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

它会导致什么错误?当更新失败时,您看到了什么?您看过了吗?@nielsabiledgaard这可能是一个关于try/catch语法的一般Ruby问题,不特定于活动记录。save methoderror是
PG::NumericValueOutOfRange:ERROR:value“10000000000”超出了integer类型的范围
,或者您可以测试该值以查看它是否无法保存。也就是说,无声地未能满足用户期望,或者其他程序员的期望,这不是一个好的总体设计原则。在Rails 5.2中,提出了
ActiveModel::RangeError
。伙计,这让事情变得脆弱。
# 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