3

Rails アプリケーションの API を実装するために ROAR を使用しています。このアプリケーションは、 subjectdescriptionなどの属性を持つことができるチケットを扱いますが、ユーザー定義の属性も持つことができます。簡単にするために、チケットが次のようになっていると仮定します。

class Ticket
  attr_accessor :subject, :description

  def custom_attributes
    # in reality these attributes depend on the current ticket instance
    # they are not hard-coded into the class
    [['priority', 'high'], ['Operating System', 'Ubuntu']]
  end
end

このようなチケットの目的の JSON 出力は次のようになります。

{
  "subject": "Foo",
  "description": "Bar",
  "customField1": "high",
  "customField2": "Ubuntu"
}

ここで、すでに問題が発生している可能性があります。すべてのプロパティはルート オブジェクトの直下の子です。つまり、それを代表として書き出すことはできません。

class TicketRepresenter
  property :subject
  property :description

  # Need to iterate over instance members on the class level here...
end

それを達成するためにROARが提供するメカニズムはありますか? たとえば、実際のインスタンスのコンテキストで実行されるコールバック。

def call_me_on_write
  represented.custom_attributes.each do |attribute|
    add_property('customField1', attribute[1])
  end
end

これを達成するために見落としたROARのようなものはありますか?

ROARのドキュメントとpresentable のドキュメントの両方を調べましたが、も見つかりませんでした。

免責事項

質問を読みやすくするために、実際の状況を単純化しようとしました。重要な情報が不足していると思われる場合は、お知らせください。ありがたいことに、詳細を提供します。

範囲外

選択した JSON 形式が良いか悪いかについて議論しないでください。ROAR がそれをサポートするかどうかを評価したいのです。

4

2 に答える 2

0

基本的な代表者からクラスを動的に作成することになりました。

class TicketRepresenter
  property :subject
  property :description

  def self.create(ticket, context = {})
    klass = Class.new(TicketRepresenter) # create a subclass of my representer
    ticket.custom_attributes.each do |attribute|
      # for each custom attribute in the actual instance insert a property into the created class
      property "customField#{attribute.id}".to_sym
               getter: -> (*) { attribute.value }
    end

    # return an instance of the class created above
    klass.new(ticket, context)
  end
end

基本的に、JSON を作成するために使用される実際のリプレゼンテーション クラスは、それぞれの で異なることを意味しますTicket

JSON からバックを読み取りたい場合はTicket、作成されたリピーター クラスがカスタム フィールドを認識し、セッターも定義できるように、リピーターを正しく初期化する必要があります。

createの代わりに新しいメソッドを慣習的に呼び出す必要がありnewます。ROAR でリピーターを作成する必要がある場合 (コレクションなど)、ROAR の多態性オブジェクト作成メカニズムを使用できます。

注:上記のコードは、私の質問に投稿されたカスタム属性の例に正確には適合しませんが、アイデアを得る必要があります(例では、属性にはidandvalueのようなメンバーはありませんでしたが、キーと値で構成されるリストでした)。

于 2015-02-13T12:47:49.433 に答える