respond_to 與 respond_with


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