jQueryとRails2.2でJSONPを実現するには

GETリクエストでid値に続けて疑似拡張子を指定すると、それに対応した出力処理を切り替えられる。

GET /foos/1
GET /foos/1.xml
GET /foos/1.js

jsonpに対応させるには、@foo.to_jsonの値を括弧で囲み、リクエストパラメータに指定されたcallbackの値をそれに前置きした値をrenderする。

class FoosController < ApplicationController

  def show
    @foo = Foo.find(params[:id])
    callback = params[:callback]

    respond_to do |format|
      format.js {
        render :text => callback + "(" + @foo.to_json+ ")"
      }
      format.html # show.html.erb
      format.xml  { render :xml =>  @foo }
    end
  end

呼び出し側のjQueryは以下の通り。

function foo_jsonp() {
  var id = $("#q").attr("value");
  jQuery.getJSON(
    "http://localhost:3000/foos/" + id + ".js?callback=?",
    function(json){

    });
}