我正在使用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
答案 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公开的内容是“资源”而不是模型。实际上,资源甚至可以是多个模型和实体的组合,允许您定义资源并在需要的地方重用它。使用实体,您可以排除字段,创建属于其他字段组合的字段。它为您提供了灵活性。