Rails API 如何在异常中添加错误并继续

Rails API How to add errors in exception and continue

在我的 Rails 项目中,我创建了获取参数并保存模型的服务对象。我想在那里处理异常,例如其中一个参数无效。我的服务对象看起来像这样:

class ModelSaver
  include ActiveModel::Validations

  attr_reader :model

  def initialize(params)
    @params = params
  end

  def errors
    @model.errors
  end

  def save_model
    @model ||= Model.new(params)

    @model.name = nil
    @model.save!

  rescue ActiveRecord::RecordNotSaved, ActiveRecord::RecordInvalid => error
    @model.errors.add(:base, error.to_s)
    false
  end

  private

  attr_reader :params
end

在模型名称中不能为 nil,因此当我尝试 @model.name = nil 时,服务对象会从 save_model 中恢复并退出。在 @model.name = nil 出现异常后,我可以以某种方式继续并添加 @model.save! 的下一个错误(如果有的话)吗?

不确定您想要实现什么,但我假设您刚刚从模型中删除了所有业务逻辑,并且只在该代码示例中保留了最低限度。

我建议不要调用 save!,只需调用 save 并检查对象是否有效。如果它没有继续做你想做的事情或添加额外的错误,如果它有效然后做其他事情。

示例:

  def save_model
    @model ||= Model.new(params)

    @model.name = nil
    @model.save

    return true if @model.valid?
    
    @model.add(:name, :invalid, message: "can't be nil")
    ... some code
  end

但除此之外,我建议添加一个自定义验证器,而不是尝试重新发明轮子,这里有一个关于如何使用它的指南:https://guides.rubyonrails.org/active_record_validations.html#performing-custom-validations