respond_to可以讓你根據客戶端要求的格式進行不同的格式回應,以 RESTful 與 Rails 中完成的應用程式首頁為例,若想要客戶端在請求http://localhost:3000/bookmarks.html、http://localhost:3000/bookmarks.xml、http://localhost:3000/bookmarks.json時,分別給HTML、XML、JSON格式回應,可以如下修改:
- bookmarks_controller.rb
class BookmarksController < ApplicationController
def index
@pages = Page.all
respond_to do |format|
format.html
format.xml { render :xml => @pages }
format.json { render :json => @pages }
end
end
...
end
上例中,respond_to傳入的區塊參數format是ActionController::MimeResponds::Collector實例,程式區塊中format.html表示如果是.html結尾請求,執行預設的render方法,format.xml、format.json表示如果是.xml或.json,執行方法後程式區塊的內容,依範例程式則是分別是指定呈現XML與JSON格式。如果想要設定預設處理,可以使用format.any方法。例如:
respond_to do |format|
format.html
format.xml { render :xml => @pages }
format.json { render :json => @pages }
format.any { render :text => "Orz" }
end
實際上,如果要整個控制器可依客戶端請求格式進行回應,可以如下:
class SomesController < ApplicationController
respond_to :html, :xml, :json
def index
...
respond_with(Some.all)
end
end
respond_to :html, :xml, :json
def index
...
respond_with(Some.all)
end
end