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
vì @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 đó?