2012-04-13 6 views
5

Ticketモデルのアプリケーションでかなり複雑なJSON応答がありました。私はTicketDecoratorをこれらの応答を作成する人にしたいと思います。DraperでRabLを使用してto_jsonをレンダリングする

しかし私は自分のシステムに既にセットアップとAPIを用意しており、RABLを使ってそれらのJSONレスポンスを作成していますので、既に作成したテンプレートを再利用したいと思います。

TicketDecorator内部メソッド内からこのような何かをRABLテンプレートをレンダリングすることが可能です場合、私は思ったんだけど:

ここに私の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方法であります:

しかし、私は正常に@ticketを設定できないため、これはうまくいかず、私はエラーが発生しますまたは@ticketがnilであるためundefined method `first_attachment_url' for nil:NilClassと表示されます。

誰も私がこれら2つの作業を一緒にうまくいかせるための良い解決策はありますか?

テンプレートを文字列にレンダリングし、手動でRABLを使用するのは私の本当の考えですが、ビューヘルパーではないのでDraperの中でrender_to_stringと呼ぶことができません。

これについてのご意見はありますか?

答えて

1

Rablのオブジェクトにアクセスする場合は、おそらくthisが役に立ちます。

カスタムノードでは、ブロック変数に頼るのではなく、オブジェクトに直接アクセスします。後者は、芋のように、取り扱いのコレクションのためのものです:

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

ます。また、それはまだルビー:)であるので、あなたは属性のような任意のオブジェクトのメソッドを呼び出すことができることを、実際に見えるかもしれません

class Ticket 
    def we_got_what 
    "the funk!" 
    end 
end 
あなたのrablにファンキーを得るためには

はちょうど行います

object @ticket 
attribute :we_got_what 
0

は、このような状況を説明rablウィキエントリがあります。到着する他の人のために、

解決方法は、デコレータからrablをレンダリングするのではなく、デコレータをrablに送信することです。責任を反転させることで、やりやすくなります。

関連する問題