Apa sebenarnya yang ingin kamu ketahui? ActiveRecord memiliki metode yang membuat catatan bersambung ke dalam JSON. Misalnya, buka konsol rel Anda dan masuk ModelName.all.to_json
dan Anda akan melihat keluaran JSON. render :json
pada dasarnya memanggil to_json
dan mengembalikan hasilnya ke browser dengan header yang benar. Ini berguna untuk panggilan AJAX di JavaScript di mana Anda ingin mengembalikan objek JavaScript untuk digunakan. Selain itu, Anda dapat menggunakan callback
opsi untuk menentukan nama panggilan balik yang ingin Anda panggil melalui JSONP.
Misalnya, katakanlah kita memiliki User
model yang terlihat seperti ini:{name: 'Max', email:' m@m.com'}
Kami juga memiliki pengontrol yang terlihat seperti ini:
class UsersController < ApplicationController
def show
@user = User.find(params[:id])
render json: @user
end
end
Sekarang, jika kita melakukan panggilan AJAX menggunakan jQuery seperti ini:
$.ajax({
type: "GET",
url: "/users/5",
dataType: "json",
success: function(data){
alert(data.name) // Will alert Max
}
});
Seperti yang Anda lihat, kami berhasil mendapatkan Pengguna dengan id 5 dari aplikasi rails kami dan menggunakannya dalam kode JavaScript kami karena dikembalikan sebagai objek JSON. Opsi panggilan balik hanya memanggil fungsi JavaScript dengan nama yang diteruskan dengan objek JSON sebagai argumen pertama dan satu-satunya.
Untuk memberikan contoh callback
opsi, lihat yang berikut ini:
class UsersController < ApplicationController
def show
@user = User.find(params[:id])
render json: @user, callback: "testFunction"
end
end
Sekarang kita dapat membuat permintaan JSONP sebagai berikut:
function testFunction(data) {
alert(data.name); // Will alert Max
};
var script = document.createElement("script");
script.src = "/users/5";
document.getElementsByTagName("head")[0].appendChild(script);
Motivasi untuk menggunakan callback seperti itu biasanya untuk menghindari perlindungan browser yang membatasi berbagi sumber daya lintas sumber (CORS). Namun, JSONP tidak banyak digunakan lagi, karena ada teknik lain untuk menghindari CORS yang lebih aman dan mudah.