2016-05-30 5 views
2

Я искал самое легкое решение для преобразования всех значений Datetime в ISO 8601 при отправке их конкретному реквестеру из API. Я был в состоянии обезьяны патча Time#to_json следующие:Как сделать все выходы времени ISO 8601 в API Ruby + Grape

class Time 
    def to_json(options = {}) 
    self.iso8601.to_json 
    end 
end 

И требую файла в before обратного вызова винограда, когда PARAMS показал запрос исходит от желаемого места.

Это лучший способ достичь этого? Мог ли я вместо этого сделать что-то в обращении after Винограда, чтобы прокрутить мои данные и преобразовать значения там? Патч обезьяны Time#to_json выполняет свою работу, но мне кажется смешно. Хотя я новичок в Ruby.

+0

Ваши инстинкты хороши. Классы переустановки обезьян должны использоваться только в качестве последнего средства. В вашем случае я думаю, что это плохая идея, потому что кто знает, где еще в программе можно было бы полагаться на поведение по умолчанию - и если не сейчас, возможно, в будущем. Вы можете добавить это сообщение в отдельные экземпляры времени, если вы можете выяснить, какие экземпляры нужно изменить. –

+0

Где ваши экземпляры 'Time'? Что вы используете в качестве бэкэнд? Не могли бы вы создать класс-оболочку (презентатор) для 'Time' и использовать это вместо этого? –

ответ

1

Вы используете Grape Entity, чтобы разоблачить ваши модели? Если вы используете его, то вы можете определить многоразовый форматировщик вроде этого:

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 Сущность ... ну, я думаю, ты должен. :)

PS .: Все примеры, которые я показал здесь, были извлечены из документации Grape Entity. https://github.com/ruby-grape/grape-entity

+0

Привет, в настоящее время не использую Grape Entity, но я посмотрел на него. Мне нужно больше аргументов в пользу этого, так как только решение этой проблемы не является достаточным основанием для инвестирования времени на переход. – Maaack

+1

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

 Смежные вопросы

  • Нет связанных вопросов^_^