0

在我的 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.save!在异常之后以某种方式继续并添加下一个错误(如果有的话)@model.name = nil吗?

4

1 回答 1

0

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

我建议不要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

于 2021-09-02T09:15:21.963 回答