gpt4 book ai didi

ruby-on-rails - 一种更优雅的退出验证失败的方法

转载 作者:行者123 更新时间:2023-12-04 03:47:40 26 4
gpt4 key购买 nike

我有一个 Question 模型,它有很多 Answer

我正在验证为每个问题创建的答案不超过三个:

has_many :answers, -> { order(position: :asc) }, before_add: :set_nested

private
def set_nested(answer)
if answers.size > 3
errors.add(:base, "Too many answers.")
raise "Unable to create answer."
else
answer.question ||= self
end
end

代码正常工作,当答案太多时,我会收到“回滚事务”和“RuntimeError:无法创建答案。”

但是 collection_association.rb 中有 20 行路径引用到不同的行。这是您做错事时的典型表情。

这是应该的,还是我做的验证有点过于残酷?

最佳答案

要抑制由于 before_add 回调引起的难看的 error stacktrace 和错误,您可以做的是 rescue 引发的错误。

例如:

如下更新您的question.rb:

class AnswersLimitExceeded < StandardError; end ## Add this

class Question < ActiveRecord::Base
has_many :answers, -> { order(position: :asc) }, before_add: :set_nested

private
def set_nested(answer)
if answers.size > 3
errors.add(:base, "Too many answers.")
raise AnswersLimitExceeded, "Unable to create answer." ## Change here
else
answer.question ||= self
end
end

在此更新 QuestionsController 中的 create 操作之后

def create
## ...
begin
if @question.save
## ...
else
## ..
end
rescue AnswersLimitExceeded
render action: 'new'
end
end

这样,只要在创建相关答案时在Question 模型中引发AnswersLimitExceeded,就会在 Controller 级别 从而优雅地抑制特定错误 AnswersLimitExceeded 和消息 Too many answers

此外,如果您注意到我创建了一个单独的错误类,即 AnswersLimitExceeded,那么我在 Controller 而不是所有其他异常中挽救这个特定异常。

关于ruby-on-rails - 一种更优雅的退出验证失败的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23418321/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com