refactor format render di beberapa pengontrol

jadi saya punya metode tampilan di beberapa pengontrol yang sebagian besar terlihat persis sama:

  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

model untuk ini berbeda, tetapi semuanya memiliki atribut yang sama yang digunakan dalam metode ini (activated, log, id). saya juga dapat mengubah render_for_api hash yang diberikan yang saat ini texts_all, documents_all dll menjadi hash yang sama di semua tempat.

apakah ada cara untuk menggunakan kode ini dalam banyak model tanpa duplikasi sebesar ini?

saya berterima kasih atas setiap petunjuknya! terutama saya merasa sulit untuk menangani blok do |format|. tetapi saya juga tidak yakin di mana harus meletakkan kodenya dan bagaimana menggunakannya dengan berbagai jenis model.

Terima kasih.


person choise    schedule 22.01.2012    source sumber


Jawaban (1)


Jika modelnya benar-benar umum:

def show
  show_model @text
end

Saya tidak yakin apa itu show!, tapi bagian itu bisa Anda pahami. Secara kasar (belum diuji):

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

Sejauh show_model tinggal, saya cenderung memasukkan hal-hal seperti itu ke dalam pengontrol dasar, atau sebagai mixin, tetapi mungkin ada opsi yang lebih baik. Karena saya biasanya memiliki pengontrol dasar, mudah untuk menyimpannya di sana.

person Dave Newton    schedule 22.01.2012
comment
Itu juga akan menjadi jawabanku! Bergantung pada ukuran/kompleksitas aplikasi Anda, saya baru saja memasukkannya ke ApplicationController sebagai metode pribadi - person Chris Bailey; 22.01.2012
comment
show! berasal dari permata warisan_resources(github.com/josevalim/inherited_resources). oke, jadi menurut Anda saya bisa memasukkannya ke dalam application_controller.rb saya. setiap pengontrol mewarisi dari yang satu ini, ide yang bagus? - person choise; 22.01.2012
comment
@choise Di sana, atau pengontrol dasar Anda sendiri--tetapi sepertinya inherited_resources memiliki kelas dasarnya sendiri, jadi pengontrol aplikasi Anda perlu memperluasnya jika belum. Juga tidak tahu apa yang dilakukan metode kelas dasar (metode !) jadi Anda harus memastikan bahwa metode tersebut kompatibel dengan model arbitrer. - person Dave Newton; 22.01.2012