我有一个 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/