2013-12-10 20 views
5

我瞭解respond_to作品時,它被稱爲像這樣的東西:當沒有塊調用時,respond_to做什麼?

def index 
    @users = User.all 
    respond_to do |format| 
    format.html 
    format.json { render json: @users } 
    end 
end 

但我已經看到了一些應用程序,其通過respond_to符號列表,的控制器方法外,如:

class UsersController < ApplicationController 

    respond_to :html, :json 

    def index 
    # blah blah bah 
    end 
end 

這是做什麼用的?我一直在用我的一個控制器玩弄它,我無法弄清楚它有什麼不同。

回答

2

對於給定的控制器操作,#respond_with根據客戶端請求的MIME類型生成適當的響應。

如果該方法被調用,只是一個資源,如在本實施例中 -

class PeopleController < ApplicationController 
    respond_to :html, :xml, :json 

    def index 
    @people = Person.all 
    respond_with @people 
    end 
end 

則MIME類型的響應典型地選擇基於所述請求的Accept報頭,並宣佈該組可用的格式的通過先前調用控制器的類方法respond_to。或者,可以通過在控制器中明確設置request.format來選擇mime類型。

如果沒有標識可接受的格式,則應用程序返回'406 - 不可接受'狀態。否則,默認響應是呈現以當前動作和所選格式命名的模板,例如, index.html.erb。如果沒有可用的模板,則行爲取決於所選的格式:

對於html響應 - 如果請求方法爲get,則會引發異常,但對於其他請求(如發佈響應)取決於資源是否有任何驗證錯誤(即假設已嘗試保存資源,例如通過創建操作) -

如果沒有錯誤,即資源已成功保存,則響應會重定向到資源,即其顯示操作。

如果存在驗證錯誤,則響應會呈現一個默認操作,即對於發佈請求爲new:對修補程序或put進行編輯。

因此像這樣的一個例子 -

respond_to :html, :xml 

def create 
    @user = User.new(params[:user]) 
    flash[:notice] = 'User was successfully created.' if @user.save 
    respond_with(@user) 
end 

是等價的,在不存在create.html.erb的,以 -

def create 
    @user = User.new(params[:user]) 
    respond_to do |format| 
    if @user.save 
     flash[:notice] = 'User was successfully created.' 
     format.html { redirect_to(@user) } 
     format.xml { render xml: @user } 
    else 
     format.html { render action: "new" } 
     format.xml { render xml: @user } 
    end 
    end 
end 

爲JavaScript請求 - 如果模板不發現,會引發異常。

對於其他請求 - 即,如xml,json,csv等數據格式,如果傳遞給respond_with的資源響應to_,則該方法試圖直接以所請求的格式呈現資源,例如,對於xml請求,響應等同於調用render xml:resource。

+0

那麼,如果沒有一個方法調用'respond_with',那麼在方法之外的'respond_to'是沒有意義的嗎? – GMA

+1

換句話說,您應該在respond_with方法中使用類方法respond_to,或者在action方法中使用實例方法respond_to和block。 – SergeyKutsko

相關問題