如何在Ruby + Grape API中使所有时间输出都是ISO 8601



我一直在寻找最简单的解决方案,在从 API 将所有日期时间值发送给特定请求者时,将它们转换为 ISO 8601。我能够通过以下方式对猴子Time#to_json进行修补:

class Time
  def to_json(options = {})
    self.iso8601.to_json
  end
end

并在 Grape 的before回调中要求该文件,当参数显示请求来自所需位置时。

这是实现这一目标的最佳方法吗?我可以在 Grape 的after回调中做一些事情来循环访问我的数据并在那里转换值吗?猴子修补Time#to_json完成了工作,但对我来说感觉很有趣。虽然我是 Ruby 的新手。

您是否使用葡萄实体来公开模型?如果你正在使用它,那么你可以定义一个可重用的格式化程序,如下所示:

module ApiHelpers
  extend Grape::API::Helpers
  Grape::Entity.format_with :iso8601 do |date|
    date.iso8601 if date
  end
end

然后,您可以在所有实体中使用此格式化程序:

module Entities
  class MyModel < Grape::Entity
    expose :updated_at, format_with: :iso8601
  end
  class AnotherModel < Grape::Entity
    expose :created_at, format_with: :iso8601
  end
end

但是,如果您不使用葡萄实体...好吧,我认为你应该。:)

PS.:我在这里展示的所有示例都摘自葡萄实体文档。https://github.com/ruby-grape/grape-entity

最新更新