Saya akan melalui panduan Memulai dengan Rails dan bingung dengan bagian 6.7. Setelah membuat scaffold, saya menemukan blok yang dibuat secara otomatis berikut di controller saya:
def index
@posts = Post.all
respond_to do |format|
format.html # index.html.erb
format.json { render :json => @posts }
end
end
Saya ingin memahami bagaimana sebenarnya blok response_to bekerja. Apa jenis variabel format? Apakah metode .html dan .json dari objek format? The dokumentasi untuk
ActionController::MimeResponds::ClassMethods::respond_to
tidak menjawab pertanyaan.
ruby-on-rails
Cole
sumber
sumber
format.html
- tanpa argumen), ia akan menggunakan konvensi (berdasarkan URL dan kata kerja HTTP) untuk memilih tampilan (diharapkan berupa HTML). Responden (format) diperintahkan di sini untuk membuat URL yang diakhiri dengan .json dengan membuat serial menjadi json, alih - alih menggunakan tampilan dan konvensi.Jawaban:
Saya baru di Ruby dan terjebak pada kode yang sama. Bagian yang saya tutupi sedikit lebih mendasar daripada beberapa jawaban yang saya temukan di sini. Ini mungkin atau mungkin tidak membantu seseorang.
respond_to
adalah metode pada superclassActionController
.do
sampaiend
, dengan|format|
sebagai argumen ke blok.format
argumen.http://api.rubyonrails.org/v4.1/classes/ActionController/Responder.html
Responder
TIDAK mengandung sebuah metode untuk.html
atau.json
, tapi kita sebut metode ini lagian! Bagian ini membuatku luput.method_missing
. Jika Anda memanggil metode yang tidak ada (sukajson
atauhtml
), Ruby memanggilmethod_missing
metode itu.http://ruby-metaprogramming.rubylearning.com/html/ruby_metaprogramming_2.html
Responder
kelas menggunakan nyamethod_missing
sebagai semacam pendaftaran. Saat kami memanggil 'json', kami mengatakannya untuk menanggapi permintaan dengan ekstensi .json dengan membuat serial ke json. Kita perlu meneleponhtml
tanpa argumen untuk mengatakannya untuk menangani permintaan .html dengan cara default (menggunakan konvensi dan tampilan).Itu bisa ditulis seperti ini (menggunakan pseudocode mirip-JS):
Bagian ini membuatku bingung. Saya masih merasa itu tidak intuitif. Sepertinya Ruby menggunakan teknik ini sedikit. Seluruh kelas (
responder
) menjadi implementasi metode. Untuk meningkatkanmethod_missing
, kita membutuhkan turunan dari kelas, jadi kita wajib menyampaikan callback ke mana mereka melewati objek seperti metode. Untuk seseorang yang memiliki kode dalam bahasa seperti C selama 20 tahun, ini sangat terbelakang dan tidak intuitif bagi saya. Bukannya itu buruk! Tapi itu adalah sesuatu yang dibutuhkan banyak orang dengan latar belakang seperti itu, dan saya pikir mungkin itulah yang diinginkan OP.ps perhatikan bahwa dalam RoR 4.2
respond_to
diekstraksi menjadi permata responden .sumber
method_missing
, mengingat Anda dapat memberikan argumen dan blok!respond_to
di controller, tanpa permata responden yang ada di Gemfile. Mungkin sedikit tentangrespond_to
diekstraksi ke dalam permata responden, telah diubah?Ini adalah blok kode Ruby yang memanfaatkan metode pembantu Rails. Jika Anda belum terbiasa dengan blok, Anda akan sering melihatnya di Ruby.
respond_to
adalah metode pembantu Rails yang dilampirkan ke kelas Controller (atau lebih tepatnya, kelas supernya). Ini merujuk pada respons yang akan dikirim ke View (yang menuju ke browser).Blok dalam contoh Anda memformat data - dengan mengirimkan parameter 'format' di blok - untuk dikirim dari controller ke tampilan setiap kali browser membuat permintaan untuk data html atau json.
Jika Anda menggunakan mesin lokal Anda dan mengatur Post scaffold Anda, Anda dapat pergi ke
http://localhost:3000/posts
dan Anda akan melihat semua posting Anda dalam format html. Tetapi, jika Anda mengetikkan ini:,http://localhost:3000/posts.json
maka Anda akan melihat semua posting Anda di objek json yang dikirim dari server.Ini sangat berguna untuk membuat aplikasi javascript berat yang harus lulus json bolak-balik dari server. Jika Anda mau, Anda dapat dengan mudah membuat api json di pagar belakang, dan hanya melewati satu tampilan - seperti tampilan indeks pengontrol Post Anda. Kemudian Anda bisa menggunakan perpustakaan javascript seperti Jquery atau Backbone (atau keduanya) untuk memanipulasi data dan membuat antarmuka Anda sendiri. Ini disebut UI tidak sinkron dan mereka menjadi sangat populer (Gmail adalah satu). Mereka sangat cepat dan memberikan pengguna akhir pengalaman yang lebih seperti desktop di web. Tentu saja, ini hanyalah satu keuntungan dari memformat data Anda.
Cara penulisan Rails 3 ini adalah sebagai berikut:
Dengan menempatkan
respond_to :html, :xml, :json
di bagian atas kelas, Anda dapat mendeklarasikan semua format yang Anda ingin controller Anda kirim ke pandangan Anda.Kemudian, dalam metode pengontrol, yang harus Anda lakukan adalah response_with (@wh whatever_object_you_have)
Itu hanya menyederhanakan kode Anda sedikit lebih banyak daripada apa yang dihasilkan Rails secara otomatis.
Jika Anda ingin tahu tentang cara kerja bagian dalam ...
Dari apa yang saya mengerti, Rails mengintrospeksi objek untuk menentukan format apa yang sebenarnya akan terjadi. Nilai variabel 'format' didasarkan pada introspeksi ini. Rails dapat melakukan banyak hal dengan sedikit info. Anda akan terkejut melihat seberapa jauh posting sederhana atau: posting akan pergi.
Misalnya, jika saya memiliki file parsial _user.html.erb yang terlihat seperti ini:
_user.html.erb
Kemudian, ini saja dalam tampilan indeks saya akan membuat Rails tahu bahwa perlu menemukan parsial 'pengguna' dan beralih melalui semua objek 'pengguna':
index.html.erb
akan memberi tahu Rails bahwa diperlukan untuk menemukan parsial 'pengguna' dan beralih melalui semua objek 'pengguna':
Anda dapat menemukan posting blog ini berguna: http://archives.ryandaigle.com/articles/2009/8/6/what-s-new-in-edge-rails-cleaner-restful-controllers-w-respond_with
Anda juga dapat membaca dengan teliti sumbernya: https://github.com/rails/rails
sumber
respond_to
danrespond_with
diperkenalkan? Saya menggunakan rel 2.3.5 dan saya mulaiNoMethodError (undefined method respond_to)
Dari apa yang saya ketahui, respond_to adalah metode yang dilampirkan ke ActionController, sehingga Anda dapat menggunakannya di setiap pengontrol tunggal, karena semuanya mewarisi dari ActionController. Inilah metode Rail_spon_to:
Anda melewatkannya satu blok , seperti yang saya perlihatkan di sini:
The | Format | bagian adalah argumen yang diharapkan oleh blok, jadi di dalam metode response_to kita bisa menggunakannya. Bagaimana?
Nah, jika Anda perhatikan kami melewati blok dengan awalan & dalam metode response_to, dan kami melakukannya untuk memperlakukan blok itu sebagai Proc. Karena argumen memiliki ".xml", ".html" kita dapat menggunakannya sebagai metode untuk dipanggil.
Apa yang pada dasarnya kita lakukan di kelas respond_to adalah memanggil metode ".html, .xml, .json" ke instance dari kelas Responder.
sumber
Untuk memahami apa
format
itu, Anda pertama-tama dapat melihat sumbernyarespond_to
, tetapi dengan cepat Anda akan menemukan bahwa yang benar-benar perlu Anda perhatikan adalah kode untuk recoverve_response_from_mimes .Dari sini, Anda akan melihat bahwa blok yang diteruskan ke
respond_to
(dalam kode Anda), sebenarnya dipanggil dan diteruskan dengan instance Kolektor (yang di dalam blok dirujuk sebagaiformat
). Kolektor pada dasarnya menghasilkan metode (saya percaya pada Rails start-up) berdasarkan apa yang diketahui tentang jenis kereta api mime .Jadi, ya,
.html
dan.json
metode didefinisikan (saat runtime) pada Collector (aliasformat
) kelas.sumber
Meta-pemrograman di balik pendaftaran responden (lihat jawaban Parched Squid) juga memungkinkan Anda melakukan hal-hal bagus seperti ini:
Baris csv akan menyebabkan to_csv dipanggil pada setiap posting ketika Anda mengunjungi /posts.csv. Ini memudahkan untuk mengekspor data sebagai CSV (atau format lain apa pun) dari situs rel Anda.
Baris js akan menyebabkan file javascript /posts.js (atau /posts.js.coffee) di-render / dieksekusi. Saya menemukan bahwa menjadi cara yang ringan untuk membuat situs yang diaktifkan Ajax menggunakan pop-up jQuery UI.
sumber
Dari java POV, format merupakan implementasi dari antarmuka anonim. Antarmuka ini memiliki satu metode bernama untuk setiap jenis mime. Ketika Anda memanggil salah satu metode tersebut (melewatinya blok), maka jika rel merasa bahwa pengguna menginginkan tipe konten itu, maka itu akan memanggil blokir Anda.
Sentuhannya, tentu saja, adalah bahwa objek lem anonim ini tidak benar-benar mengimplementasikan antarmuka - ia menangkap metode panggilan secara dinamis dan berhasil jika namanya jenis pantomim yang diketahuinya.
Secara pribadi, saya pikir itu terlihat aneh: blok yang Anda lewati dieksekusi . Akan lebih masuk akal bagi saya untuk lulus dalam hash label format dan blok. Tapi - begitulah yang dilakukan dalam RoR, tampaknya.
sumber
Ini agak ketinggalan jaman, oleh Ryan Bigg melakukan pekerjaan yang bagus menjelaskan ini di sini:
http://ryanbigg.com/2009/04/how-rails-works-2-mime-types-respond_to
Bahkan, mungkin sedikit lebih detail daripada yang Anda cari. Ternyata, ada banyak hal yang terjadi di belakang layar, termasuk kebutuhan untuk memahami bagaimana tipe MIME dimuat.
sumber
"Format" adalah jenis respons Anda. Bisa json atau html, misalnya. Ini adalah format output yang akan diterima pengunjung Anda.
sumber
Ada satu hal lagi yang harus Anda waspadai - MIME.
Jika Anda perlu menggunakan tipe MIME dan tidak didukung secara default, Anda dapat mendaftarkan penangan Anda sendiri di config / initializers / mime_types.rb:
Mime::Type.register "text/markdown", :markdown
sumber