ActiveModel :: Serializer - 如何在集合序列化期间捕获和处理各个资源的错误?

时间:2017-07-18 15:09:39

标签: ruby-on-rails ruby-on-rails-4 active-model-serializers

在rails应用程序中,我有一个我想呈现为json的集合。由于引发错误,集合中的某些项可能无法成功序列化。我想通过将它们报告给我们的错误记录服务来捕获这些错误并处理它们,并且还在json数组中提供一个虚拟记录来表示可卸载记录,以便客户端软件可以使用它。

具有1个无法加载记录的所需哈希集合示例:

[
  { id: 1, name: "foo", ... many other properties },
  { id: 2, name: "bar", ... many other properties },
  { unloadable_record: true, id: 3, name: "baz" }
]

我目前能够通过处理控制器中的所有内容来实现这一点(这比我想要的更多):

def index
  render json: safely_serialized_records
end

private

def safely_serialized_records
  @records.map do |r|
    begin
      ActiveModelSerializers::SerializableResource.new(r, include: "**").as_json
    rescue StandardError => e
      report_unloadable_record(e, r)
      {
        unloadable_record: true,
        id: r.id,
        name: r.name
      }
    end
  end
end

但是我希望避免这种方法的缺点:它将太多的视图渲染问题放入控制器中,Rails日志不再将json序列化归因于view部分响应时间(使得表现不那么容易评估),并且“我做错了”的感觉。

我尝试了一些与serializer调用中设置each_serializeradapterrender选项有关的其他方法。我实现了自定义类来继承敏感的基础(例如ActiveModelSerializers::Adapter::Attributes)并覆盖serializable_hash,例如:

def serializable_hash(*args)
  begin
    super
  rescue StandardError => e
    handle_unloadable_record(e, serializer.object)
  end
end

......但无济于事。

AMS是否采用干净的方法来实现我的目标?

0 个答案:

没有答案