2016-05-30 15 views
2

APIから特定のリクエスタに送信する際に、すべてのDatetime値をISO 8601に変換する最も簡単なソリューションを探しています。すべてのTime出力をRuby + Grape APIのISO 8601にする方法

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

とのparamsは、リクエストが所望の位置から来たことが示されたブドウのbeforeコールバック内のファイルが必要です。私は次のようにモンキーパッチTime#to_jsonすることができました。

これを達成するための最良の方法ですか?代わりに、データをループしてそこに値を変換するために、ブドウのafterコールバックで何かをしていることがありますか? Monkey patching Time#to_jsonは仕事を終わらせるが、面白いと感じる。私はRubyには新しいですが。

+0

あなたの本能は良好です。モンキーパッチクラスは最後の手段としてのみ使用してください。あなたのケースでは、プログラムのどこにデフォルトの動作が依存しているかを知っているので、それは悪い考えだと思います。変更が必要なインスタンスを特定できる場合は、このメッセージを個々のTimeインスタンスに追加できます。 –

+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 

をしかし、あなたはブドウを使用していない場合は、あなたがそれを使用しているなら、あなたはこのような再利用可能なフォーマッタを定義することができますエンティティ...まあ、私はあなたがすべきだと思います。 :)

PS:ここで示したすべての例は、Grape Entityのドキュメントから抽出したものです。 https://github.com/ruby-grape/grape-entity

+0

こんにちは、現在ブドウの実体を使用していませんが、私はそれをいくつか見ました。この問題を解決するだけで、移行の時間を投資するのに十分な理由ではないので、私はそれを支持するより多くの議論が必要です。 – Maaack

+1

まず、APIの変更をモデルの変更から守るようにしてください。また、Rest APIを使用して公開するものは、モデルではなく「リソース」です。実際、リソースは複数のモデルの組み合わせであっても可能です。エンティティを使用すると、リソースを定義し、必要なときにいつでもリソースを再利用できます。エンティティを使用すると、フィールドを除外し、他のフィールドの組み合わせであるフィールドを作成できます。簡単に言えば、柔軟性があります。 – Marlon

関連する問題