รูปแบบการเรนเดอร์รีแฟคเตอร์ในคอนโทรลเลอร์หลายตัว

ดังนั้นฉันจึงมีวิธีการดูในคอนโทรลเลอร์หลายตัวซึ่งส่วนใหญ่จะมีลักษณะเหมือนกันทุกประการ:

  def show
    show! do |format|
      format.json do
        if @text.activated?
          @text.log
          render_for_api :texts_all, :json => @text
        else
          render :nothing => true
        end
      end
      format.pdf do
        pdf = QrPdf.new(@text)
        send_data pdf.render, filename: "text_#{@text.id}.pdf", type: "application/pdf"
      end
    end
  end

โมเดลสำหรับสิ่งนี้แตกต่างกัน แต่ทั้งหมดมีคุณลักษณะเดียวกันกับที่ใช้ในวิธีนี้ (activated, log, id) ฉันยังสามารถเปลี่ยนแฮชที่กำหนด render_for_api ซึ่งปัจจุบันคือ texts_all, documents_all ฯลฯ เป็นแฮชที่เหมือนกันทุกที่

มีวิธีใช้โค้ดนี้ในหลาย ๆ รุ่นโดยไม่ต้องมีการทำซ้ำจำนวนมหาศาลนี้หรือไม่?

ฉันขอบคุณสำหรับทุกคำแนะนำ! โดยเฉพาะอย่างยิ่งฉันพบว่ามันยากที่จะจัดการกับบล็อก do |format| แต่ฉันไม่แน่ใจว่าจะใส่โค้ดไว้ที่ไหนและจะใช้กับรุ่นประเภทต่างๆ ได้อย่างไร

ขอบคุณ.


person choise    schedule 22.01.2012    source แหล่งที่มา


คำตอบ (1)


หากโมเดลเป็นแบบทั่วไปจริงๆ:

def show
  show_model @text
end

ฉันไม่แน่ใจว่า show! คืออะไร แต่ส่วนนั้นคุณคงเข้าใจได้ ประมาณ (ยังไม่ได้ทดสอบ):

def show_model(obj)
  show! do |f|
    f.json do
      return render(:nothing => true) unless obj.activated?

      obj.log
      render_for_api :texts_all, :json => obj
    end

    f.pdf do
      opts = { filename: "text_#{obj.id}.pdf", type: "application/pdf" }
      send_data QrPdf.new(obj).render, opts
    end
  end
end

เท่าที่ show_model อาศัยอยู่ ฉันมักจะใส่สิ่งต่าง ๆ เช่นนั้นลงในตัวควบคุมฐานหรือเป็นมิกซ์อิน แต่อาจมีตัวเลือกที่ดีกว่า เนื่องจากฉันมักจะมีตัวควบคุมฐานอยู่แล้ว จึงง่ายที่จะเก็บไว้ที่นั่น

person Dave Newton    schedule 22.01.2012
comment
นั่นก็จะเป็นคำตอบของฉันเช่นกัน! ขึ้นอยู่กับขนาด/ความซับซ้อนของแอปของคุณ ฉันจะวางมันลงใน ApplicationController เป็นวิธีส่วนตัว - person Chris Bailey; 22.01.2012
comment
show! มาจาก inherited_resources gem(github.com/josevalim/inherited_resources) โอเค คุณคิดว่าฉันสามารถใส่มันไว้ใน application_controller.rb ของฉันได้ไหม คอนโทรลเลอร์ทุกตัวสืบทอดมาจากอันนี้ เป็นความคิดที่ดีเหรอ? - person choise; 22.01.2012
comment
@choise There หรือตัวควบคุมฐานของคุณเอง - แต่ดูเหมือนว่า inherited_resources จะมีคลาสพื้นฐานของตัวเอง ดังนั้นตัวควบคุมแอปของคุณจะต้องขยายสิ่งนั้นหากยังไม่มี ยังไม่รู้ด้วยว่าเมธอดคลาสพื้นฐานทำอะไร (เมธอด !) ดังนั้นคุณต้องแน่ใจว่ามันเข้ากันได้กับโมเดลที่กำหนดเอง - person Dave Newton; 22.01.2012