2016-06-02 1 views
1

Я создаю REST API в Ruby, используя Grape.Как глубоко форматировать все атрибуты datetime в ruby-объекте?

Мой интерфейс написан в AnguarJS, а стандартная сериализация datetime по умолчанию, сделанная Grape, неправильно понята angulars' date filter. Поэтому моя идея - отформатировать все атрибуты datetime в ruby ​​перед отправкой.

Каков наилучший подход?

  • Есть ли общий Time сериализации в Grape, что я могу использовать?

  • Если нет, то возможно выполнить глубокий поиск в списке или карте рубинов, найти все экземпляры времени и заменить их форматированной строкой?

Мое текущее решение ниже тесно связано для одного атрибута, но я хотел бы расширить это форматирование на все временные моменты.

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

ответ

1

Если вы используете Виноградное 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 

Я считаю, что это лучший способ справиться с этой проблемой, потому что вы не должны изменить Класс времени просто для решения проблемы в вашем слое «Просмотр». Использование Grape Entity также является хорошей практикой. Вы всегда должны защищать свой API от возможных изменений в ваших моделях. Кроме того, помните, что то, что вы открываете через Rest API, это «Ресурсы», а не Модели. Фактически, ресурс может быть даже комбинацией нескольких моделей и объектов, которые позволяют вам определять ресурс и использовать его везде, где вам это нужно. Используя объекты, вы можете исключать поля, создавать поля, которые являются комбинацией других полей. Это дает вам гибкость.