在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_serializer
,adapter
和render
选项有关的其他方法。我实现了自定义类来继承敏感的基础(例如ActiveModelSerializers::Adapter::Attributes
)并覆盖serializable_hash
,例如:
def serializable_hash(*args)
begin
super
rescue StandardError => e
handle_unloadable_record(e, serializer.object)
end
end
......但无济于事。
AMS是否采用干净的方法来实现我的目标?