簡體   English   中英

Rails渲染部分Ajax錯誤但是調試器中顯示正確的響應

[英]Rails render partial Ajax Error BUT correct response shown in Debugger

我正在嘗試使用不引人注目的Javascript在現有鏈接上觸發附加的ajax查詢。

Query將進入服務器並進行處理,為測試返回字符串“javascript template ok”。

但是,ajax“成功”功能從未被調用過。 在適當的位置,它是觸發的“錯誤”功能......

我查看了Chrome調試器,我可以看到從服務器返回的響應文本,但從來沒有被稱為“成功”的方法...... :-(

我的電話是

jQuery.ajax({
    type: 'POST',

    success: function(response) {   
        $("#details").html(response);
        console.log(response);
    },
    error: function(){ 
        alert("Error\nData could not be retrieve from the server");
    },
    url: '/treeview/show/1538.js',
    cache: false,
});

(在此示例中,url被編碼)。 瀏覽器中的相同Url獲取沒有布局的正確數據:-)

刪除url中的“.js”會返回帶有布局的html模板,並且正確地實現了“details”div的更新...

控制器是

    respond_to do |format|
      format.html # show.html.erb
      format.js   { render :inline => "JAVASCRIPT TEMPLATE !" }
    end

謝謝

編輯:

這是從ajax查詢返回的對象(錯誤的第一個參數:function(jqXHR)):

Object
    abort: function ( statusText ) {
    always: function () {
    complete: function () {
    done: function () {
    error: function () {
    fail: function () {
    getAllResponseHeaders: function () {
    getResponseHeader: function ( key ) {
    overrideMimeType: function ( type ) {
    pipe: function ( /* fnDone, fnFail, fnProgress */ ) {
    progress: function () {
    promise: function ( obj ) {
    readyState: 4
    responseText: "JAVASCRIPT TEMPLATE !"
    setRequestHeader: function ( name, value ) {
    state: function () {
    status: 200
    statusCode: function ( map ) {
    statusText: "OK"
    success: function () {
    then: function ( /* fnDone, fnFail, fnProgress */ ) {
    __proto__: Object

所以我得到了正確的回復文本?? !! 哪里可以出錯呢? :-s

您沒有為jQuery.ajax顯式指定dataType選項,因此jQuery將其推斷為script (依賴於Rails提供的MIME類型)。 JAVASCRIPT TEMPLATE ! 不是有效的Javascript語句,拋出了解析器錯誤。 調用success回調而不是error有兩種選擇:

dataType明確指定為text

jQuery.ajax({
    type: 'POST',
    dataType: 'text',
    // ...
});

或者從控制器返回有效的Javascript:

respond_to do |format|
  format.html # show.html.erb
  format.js { render :inline => "{}" }
end

您是否認為響應可能會被評估為javascript代碼並因此拋出一個被捕獲的錯誤?

好吧,我不確定這個,但也許其中一個有幫助:

使用done()fail()而不是錯誤/成功。 像這樣:

$.ajax({ ...}).done(...).fail(...);

要么

嘗試在成功/錯誤回調中使用正確的函數參數。 也許jQuery不喜歡簽名因此不調用函數?

到你的ajax電話,添加

dataType: 'json',

和,控制器

format.js   render :text => { :some_data => "JAVASCRIPT TEMPLATE !" }.to_json

編輯錯誤調用以將錯誤數據傳遞給DOM:

error: function(data){ console.log(data); }

然后你會看到到底發生了什么。

這是你應該做的:

$.post('/treeview/show/1538.js', function(response, data){
  $("#details").html(data.responseText);
}).error(function(){
  alert("Error\nData could not be retrieve from the server");
})

在控制器中可選

respond_to do |format|
  format.html # show.html.erb
  format.js   { render text: "JAVASCRIPT TEMPLATE !" }
end

試試吧。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM