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
在我的 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