2010-07-07 33 views
2

我有一個奇怪的錯誤,可能是服務器端問題。即使響應狀態爲200,我的錯誤回調也始終被觸發!總是得到jQuery.ajax的錯誤回調(Rails)

的Javascript //客戶

function save_pomodoro(){ 
j.ajax({ 
    url: '/app/save_pomodoro', 
    dataType: 'json', 
    cache : false, 
    success: save_pomodoro_suc, 
    error: save_pomodoro_err, 
    data: { 
     bar: 'foo' 
    } 
}) 
} 

function save_pomodoro_suc(data){ 
alert("Pomodoro Saved Succesfuly") 
} 

function save_pomodoro_err(data){ 
show_error(data.status, data.responseText) // on success => 200, "OK" 
              // on fail 400, "bla bla bla" 
} 

的Rails //控制器

def save_pomodoro 

... 

p = Pomodoro.new(params[:bar]) 

if p.save 
    respond_to do |format| 
    format.html { redirect_to :action => 'index' } 
    format.js { render(:json => "OK") } 
    end 
else 
    respond_to do |format| 
    format.html { redirect_to :action => 'index' } 
    format.js { render(:json => p.errors.full_messages.to_json, :status => 400) } 
    end 
end 

end 

我已經工作回調這同一個控制器上的另一個功能(AJAX +服務器)。
這是神祕的對我,所以任何見解將有助於

更新:找到錯誤:

format.js { render(:json => ["OK"]) } 

顯然通過自身的字符串不是有效的JSON。

+2

你得到畸形的JSON回來?螢火蟲怎麼樣? – 2010-07-07 20:31:27

+0

@丹Heberden響應看起來不錯,顯示沒有錯誤答案。當出現錯誤時*紅色* – 2010-07-07 20:34:41

+1

那麼,RED通常是400錯誤。加載網絡選項卡,發出請求並檢查響應 - 是否有效?它是多餘的文本JSON?也許可以通過jsonlint.com運行它來驗證它? – 2010-07-07 20:41:24

回答

1

調試這一個有用的方法是將錯誤處理程序的簽名從

function save_pomodoro_err(data) 

改變

function save_pomodoro_err(XMLHttpRequest, textStatus, errorThrown) 

,並添加警報或一些這樣的(使用螢火蟲或調試),以獲得字符串errorThrown

這將使您能夠訪問拋出的特定錯誤消息:除了失敗的HTTP狀態(例如JSON上的解析錯誤)或超時之外,您可以傳遞給錯誤處理程序。

0

試試這個:

j.ajax({ 
    url: '/app/save_pomodoro', 
    dataType: 'json', 
    cache : false, 
    success: function() { save_pomodoro_suc() }, 
    error: function() { save_pomodoro_err() }, 
    data: { 
     bar: 'foo' 
    } 
});