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

时间:2016-06-02 11:32:27

标签: ruby datetime grape

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

我的前端是用AnguarJS编写的,angulars' date filter无法正确理解Grape制作的默认日期时间序列化。所以我的想法是在发送之前格式化ruby中的所有日期时间属性。

最好的方法是什么?

  • 我可以使用Grape中的通用Time序列化吗?

  • 如果没有,是否可以在ruby列表或地图中执行深度查找,找到所有Time实例,并用格式化的字符串替换它们?

我目前的解决方案是针对一个属性紧密耦合的,但我想将此格式扩展到所有Time instantes。

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

1 个答案:

答案 0 :(得分:2)

如果您正在使用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

我认为这是解决此问题的最佳方法,因为您不应仅仅为了解决View层中的问题而更改Time类。使用Grape Entity也是一种很好的做法。您应该始终保护API不受模型中可能的更改的影响。另外,请记住,通过Rest API公开的内容是“资源”而不是模型。实际上,资源甚至可以是多个模型和实体的组合,允许您定义资源并在需要的地方重用它。使用实体,您可以排除字段,创建属于其他字段组合的字段。它为您提供了灵活性。