2012-04-13 26 views
5

Tôi có một số câu trả lời JSON khá phức tạp trong ứng dụng của mình cho mô hình Ticket và tôi muốn TicketDecorator là người xây dựng các phản hồi đó.Sử dụng RABL với Draper để hiển thị to_json

Tuy nhiên, tôi đã thiết lập và API cho hệ thống của mình và sử dụng RABL để xây dựng các phản hồi JSON đó, vì vậy tôi muốn sử dụng lại các mẫu mà tôi đã tạo.

Tôi tự hỏi nếu nó có thể làm cho một mẫu RABL từ bên trong một phương pháp bên TicketDecorator, một cái gì đó như thế này:

Đây là RABL tôi Mẫu 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 

và đây là phương pháp TicketDecorator của tôi :

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

Tuy nhiên, điều này không hiệu quả vì tôi không thể đặt thành công @ticket và tôi gặp lỗi hoặc nói: undefined method `first_attachment_url' for nil:NilClass@ticket là không.

Bất kỳ ai có bất kỳ giải pháp tốt nào về cách tôi có thể làm cho hai công việc này trở nên độc đáo cùng nhau?

Ý tưởng thực sự duy nhất của tôi là hiển thị mẫu thành chuỗi và sử dụng RABL theo cách thủ công, nhưng tôi không chắc chắn cách tôi có thể gọi render_to_string bên trong Draper vì trình trợ giúp không phải của nó.

Bất kỳ suy nghĩ nào về điều đó?

Trả lời

1

Nếu đó là vấn đề truy cập các đối tượng trong Rabl, có thể this có thể giúp bạn.

Cũng trên các nút tùy chỉnh của bạn, tôi sẽ truy cập trực tiếp vào đối tượng, thay vì dựa vào biến khối. Sau đó là imo nghĩa để xử lý các bộ sưu tập, như thế này:

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

Bạn cũng có thể nhìn vào thực tế, bạn có thể gọi bất kỳ phương pháp đối tượng như một thuộc tính vì nó vẫn là Ruby :)

class Ticket 
    def we_got_what 
    "the funk!" 
    end 
end 

Để có được sự sôi nổi trong Rabl của bạn chỉ cần làm:

object @ticket 
attribute :we_got_what 
0

Hiện tại có một mục nhập rabl wiki mô tả tình huống như thế này. Đối với những người khác đến, check it out here

Giải pháp là gửi trang trí cho rabl thay vì hiển thị rabl từ trang trí. Flipping trách nhiệm làm cho mọi thứ dễ dàng hơn một chút.

Các vấn đề liên quan