2015-05-10 88 views
1

當我用$.ajax()與以下respond_to塊提交表格的內容:爲什麼刪除respond_to後「已完成406不可接受」已經消失?

respond_to do 
    render :json => { :url => question_path(resource, :recent => :true), 
      :uploadPath => question_path(@question, :format => "json"), 
      :editPath => edit_question_path(@question), 
      :exitPath => question_path(resource) 
    } 
end 

我有一個錯誤:

Completed 406 Not Acceptable in 124690.7ms (Views: 0.4ms | ActiveRecord: 16.7ms | Sphinx: 0.0ms) 

後我除去respond_to,作爲上述代碼被改變爲:

render :json => { :url => question_path(resource, :recent => :true), 
      :uploadPath => question_path(@question, :format => "json"), 
      :editPath => edit_question_path(@question), 
      :exitPath => question_path(resource) 
    } 

錯誤消失了,爲什麼會發生這種情況?我錯過了什麼?謝謝!

回答

3

respond_to用於當您想爲同一個控制器動作產生不同的響應。例如,您可能想要爲瀏覽器呈現HTML,但爲API客戶端呈現JSON。列出所有可以生成(以及他們如何應生成)的響應,並軌選秀權相匹配的要求之一:

respond_to do |format| 
    format.html { ... } 
    format.json { ... } 
end 

在上述軌道的例子就知道如何生成HTML和JSON反應,但如果請求來到請求一個XML響應,那麼rails會產生一個406錯誤(不可接受),因爲它不知道如何產生這樣的響應。

在你的代碼片段中,你打電話給respond_to,所以你告訴rails只使用塊給出的響應格式,但是你沒有定義任何響應格式(因爲你沒有使用對象產生的塊),因此rails會生成一個406.

當你刪除對respond_to的調用時,Rails不再擔心嘗試選擇正確的響應格式,只是使用你的調用來渲染(無論請求的格式如何) 。

如果你想使用respond_to你會做

respond_to do |format| 
    format.json { render :json => { ... }} 
end 
這樣做時,你需要確保請求請求JSON

- 如果軌雖然它要求的HTML,那麼你會回來給你406錯誤。您可以使用jQuery的dataType選項或使用.json的擴展名(即請求您的請求到/foo/bar.json

+0

您的詳細解釋讓我終於理解'respond_to'和'* .html/json'之間的關係,謝謝 – abelard2008