2014-02-21 80 views
0

我正在關閉文件運行JS遊戲://並嘗試向本地主機Rails服務器發出發佈請求以添加高分條目。jQuery AJAX POST on Rails偏頭痛

JS:

highScoresEntryView.keyHandlers = function() { 
    var that = this; 
    this.parent.keydown(function(event) { 
     event.preventDefault(); 
     event.stopPropagation(); 
     if(event.which == 27) { 
     //... 
     } else if (event.which == 13) { 
     if(that.entryString !== "") { 
      that.scoreObject.score.player = that.entryString; 
      that.submitScore(that.scoreObject); 
     } else { 
      AsteroidsUI.initializeMainMenu(); 
     } 
     } 
    }); 
    }; 

    highScoresEntryView.submitScore = function() { 
    var that = this; 
    $.ajax({ 
     type: "POST", 
     url: AsteroidsUI.highScoresHost, //http://localhost:3000/scores/ 
     data: that.scoreObject, 
     crossDomain: true, 
     dataType: "json", 
     success: function(a, b, c) { 
     console.log(a); 
     console.log(b); 
     console.log(c); 
     alert("Congrobulations! Score sent."); 
     AsteroidsUI.initializeMainMenu(); 
     }, 
     error: function(a, b, c) { 
     console.log(a); 
     console.log(b); 
     console.log(c); 
     alert("Could not send score :("); 
     AsteroidsUI.initializeHighScoresEntry(that.scoreObject); 
     } 
    }); 
    }; 

控制器:

def create 
    @score = Score.new(params[:score]) 
    if @score.save 
     render :json => @score, :status => 201 
    else 
     render :json => { :errors => @score.errors.full_messages }, :status => 422 
    end 
    end 

我找回狀態爲201的響應與數據庫中輸入內容,但是當我檢查的螢火響應,它出現空白, ajax請求的錯誤處理程序觸發而不是成功處理程序。我已經瀏覽了大約十幾個類似的問題,迄今爲止,還沒有任何解決方案對我有用 - 我嘗試在text,html和json之間更改dataType,結果相同。

+0

你什麼時候發送請求?可以發佈這個'$ .ajax'被調用的整個js代碼嗎? – Andrei

+0

你可以刪除狀態部分並嘗試嗎? – Hesham

+0

@ H-man當狀態被刪除時,我得到了相同的結果,只有200 OK代碼。答覆是空白的。響應對象,通過的console.log所解釋,是這樣的: \t readyState的0 responseText的「」 狀態0 狀態文本「錯誤」 – Vardarac

回答

0

這是一個CORS問題。我解決它通過添加類似於this tutorial下面的代碼我的Rails控制器:

def set_headers 
    headers['Access-Control-Allow-Origin'] = '*' 
    headers['Access-Control-Expose-Headers'] = 'ETag' 
    headers['Access-Control-Allow-Methods'] = 'GET, POST' 
    headers['Access-Control-Allow-Headers'] = '*,x-requested-with,Content-Type,If-Modified-Since,If-None-Match' 
    headers['Access-Control-Max-Age'] = '86400' 
    end 

我真的不知道爲什麼這個工作,讓成功回調。 AJAX是否需要響應中的這些頭文件才能進行成功回調?