如何深度格式化 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中的所有日期时间属性。
最好的方法是什么?
我可以使用 Grape 中的通用 Time 序列化吗?
如果不行,是否可以在 ruby 列表或映射中执行深度查找,找到所有 Time 实例,并用格式化字符串替换它们?
我下面的当前解决方案针对一个属性紧密耦合,但我想将此格式扩展到所有时间实例。
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" 而不是模型。事实上,资源甚至可以是多个模型和实体的组合,允许您定义资源并在需要的任何地方重用它。使用实体,您可以排除字段,创建由其他字段组合而成的字段。它给你灵活性。
我正在使用 Grape 在 Ruby 中构建 REST API。
我的前端是用AnguarJS and the default datetime serialization made by Grape is not correctly being understood by angulars' date filter写的。所以我的想法是在发送之前格式化ruby中的所有日期时间属性。
最好的方法是什么?
我可以使用 Grape 中的通用 Time 序列化吗?
如果不行,是否可以在 ruby 列表或映射中执行深度查找,找到所有 Time 实例,并用格式化字符串替换它们?
我下面的当前解决方案针对一个属性紧密耦合,但我想将此格式扩展到所有时间实例。
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" 而不是模型。事实上,资源甚至可以是多个模型和实体的组合,允许您定义资源并在需要的任何地方重用它。使用实体,您可以排除字段,创建由其他字段组合而成的字段。它给你灵活性。