5

モデルのアプリケーションにかなり複雑な JSON 応答がいくつかあるので、それらの応答を作成するのはTicket私にしたいと考えています。TicketDecorator

ただし、システム用の API を既にセットアップしており、RABL を使用してこれらの JSON 応答を作成しているため、既に作成したテンプレートを再利用したいと考えています。

次のように、メソッド内から RABL テンプレートをレンダリングできるかどうか疑問に思っていますTicketDecorator

これが私のRABLテンプレートですtickets/show.json.rabl

object @ticket

attributes :id, :link, :reported_ago_in_words_with_reporter,
           :last_updated_in_words_with_updater, :priority_label, :status,
           :location, :category_list

node(:attachment_urls) { |ticket| [ asset_path(ticket.first_attachment_url),     asset_path(ticket.second_attachment_url), asset_path(ticket.third_attachment_url) ] }

node(:comment_count) { |ticket| ticket.comments.count }

child :recent_comments do
  extends 'comments/index'
end

ここに私のTicketDecorator方法があります:

class TicketDecorator < ApplicationDecorator
  def as_json
    h.render(template: "tickets/show", formats: :json)
  end
end

ただし、@ticket を正常に設定できないため、これは機能せず、次のようなエラーが表示され undefined method `first_attachment_url' for nil:NilClassます@ticket

これら2つをうまく連携させる方法について、誰か良い解決策がありますか?

render_to_string私の唯一の本当の考えは、テンプレートを文字列にレンダリングし、RABL を手動で使用することですが、ビューヘルパーではないため、Draper 内でどのように呼び出すことができるかわかりません。

それについて何か考えはありますか?

4

2 に答える 2

1

Rabl のオブジェクトにアクセスする場合は、これが役立つかもしれません。

また、カスタム ノードでは、ブロック変数に依存する代わりに、オブジェクトに直接アクセスします。後者は、次のようにコレクションを処理するためのものです。

collection @tickets
  attribute :name
  node(:some_complex_stuff) {|ticket| ticket.vendor.heavy_lifting}

また、Ruby であるため、属性のような任意のオブジェクト メソッドを呼び出すことができるという事実を調べることもできます :)

class Ticket
  def we_got_what
    "the funk!"
  end
end

Rabl でファンキーになるには、次のようにします。

object @ticket
 attribute :we_got_what
于 2012-06-16T21:52:56.297 に答える
0

現在、このような状況を説明する rabl wiki エントリがあります。その他の到着については、こちらをご覧ください

解決策は、デコレータから rabl をレンダリングするのではなく、デコレータを rabl に送信することです。責任を反転させると、物事が少し簡単になります。

于 2013-04-15T04:55:56.280 に答える