如何深度格式化 ruby 对象中的所有日期时间属性?

How to deep format all datetime attributes in ruby object?

我正在使用 Grape 在 Ruby 中构建 REST API。

我的前端是用AnguarJS and the default datetime serialization made by Grape is not correctly being understood by angulars' date filter写的。所以我的想法是在发送之前格式化ruby中的所有日期时间属性。

最好的方法是什么?

我下面的当前解决方案针对一个属性紧密耦合,但我想将此格式扩展到所有时间实例。

    result_json.each do | x |
      x[:date] = x[:date].strftime("%Y%m%dT%H:%M:%S")
    end

如果您正在使用 Grape Entity,那么您可以扩展 ApiHelper 以包含一个新的格式化程序。例如:

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

我认为这是解决此问题的最佳方法,因为您不应更改时间 class 只是为了解决视图层中的问题。使用 Grape Entity 也是一种很好的做法。您应该始终保护您的 API 免受模型中可能发生的更改。另外,请记住,您通过 Rest API 公开的是 "Resources" 而不是模型。事实上,资源甚至可以是多个模型和实体的组合,允许您定义资源并在需要的任何地方重用它。使用实体,您可以排除字段,创建由其他字段组合而成的字段。它给你灵活性。