對於給定的控制器操作,#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。
那麼,如果沒有一個方法調用'respond_with',那麼在方法之外的'respond_to'是沒有意義的嗎? – GMA
換句話說,您應該在respond_with方法中使用類方法respond_to,或者在action方法中使用實例方法respond_to和block。 – SergeyKutsko