2013-08-26 17 views
0

我有一個數據表表:on Rails的在數據表使用Jeditable使用Ruby

%table.table.datatable#datatable 
    %thead 
     %tr 
     %th Name 
    %tbody 
     - @cars.each do |car| 
     %tr 
      %td 
      = car.name 

而且Jeditable代碼基於:http://datatables.net/release-datatables/examples/api/editable.html

:javascript 
$(document).ready(function() { 
    /* Init DataTables */ 
    var oTable = $('#datatable').dataTable(); 

    /* Apply the jEditable handlers to the table */ 
    oTable.$('td').editable('update', { 
     "callback": function(sValue, y) { 
      var aPos = oTable.fnGetPosition(this); 
      oTable.fnUpdate(sValue, aPos[0], aPos[1]); 
     }, 
     "submitdata": function (value, settings) { 
      return { 
       "row_id": this.parentNode.getAttribute('id'), 
       "column": oTable.fnGetPosition(this)[2] 
      }; 
     }, 
     "height": "14px", 
     "width": "100%" 
    }); 
}); 

我收到以下錯誤時的頁面加載:

DataTables警告(表id ='datatable'):無法重新初始化DataTable。 要檢索的DataTable對象此表,未傳遞參數或查看bRetrieve和bDestroy

的文檔之前補充一點:var oTable = $('#datatable').dataTable();

$('#datatable').dataTable({ 
     "bRetrieve":true, 
     "bDestroy":true 
    }); 

然而,我的桌子依然是不可編輯!

+0

這是您在HTML中唯一的DataTable嗎? – mgalindez

+0

對於這個特定的頁面是的,但我有其他頁面中的其他DataTables。另外,請記住我簡化了這個問題的目的... – Bruno

+0

您使用的是什麼版本的Rails,並且使用pjax或turbolinks? – Catharz

回答

1

我最初認爲問題出現在您的HAML中。 DataTables會將它自己的「dataTable」類應用到您的表中,我認爲這可能會導致它認爲該表已經被初始化。

在jEditable示例的頁面源代碼中,您可以看到DataTables在將表初始化時將'dataTable'類添加到表中。

<table cellpadding="0" cellspacing="0" border="0" class="display dataTable" id="example" aria-describedby="example_info"> 
</table> 

他們只需要與來初始化其表:

var oTable = $('#example').dataTable(); 

我認爲添加類「數據表」表可能會混淆數據表並使其抱怨重新初始化。但從jsFiddle的簡短測試來看,情況並非如此。我得到一個帖子錯誤(顯然),但沒有初始化錯誤。

我創建的小提琴是here

不過,你唯一需要在你的表上的是'dataTable'id。

您的「修復」實際上並未解決問題。如果您在第6390行左右查看DataTable(v1.9.4)源代碼,您會注意到bDestroy標誌會導致任何先前初始化的DataTable實例被銷燬。

/* Base check on table node */ 
if (DataTable.settings[i].nTable == this) 
{ 
    if (oInit === undefined || oInit.bRetrieve) 
    { 
     return DataTable.settings[i].oInstance; 
    } 
    else if (oInit.bDestroy) 
    { 
     DataTable.settings[i].oInstance.fnDestroy(); 
     break; 
    } 
    else 
    { 
     _fnLog(DataTable.settings[i], 0, "Cannot reinitialise DataTable.\n\n"+ 
     "To retrieve the DataTables object for this table, pass no arguments or see "+ 
     "the docs for bRetrieve and bDestroy"); 
     return; 
    } 
} 

因此,清除以前初始化的表,錯誤信息消失。但它不能解決問題(如你所述)。

嘗試對此表使用不同的ID(稱之爲'#editableTable'或其他),然後查看是否解決了問題。如果是這樣,那麼你有另一個初始化表與相同的ID 類。如果在檢查不是這種情況後仍然出現初始化錯誤,我會確認您沒有使用可能導致問題的pjax或turbolink。

+0

還沒有機會測試這個。我結束了使用best_in_place寶石:http://stackoverflow.com/questions/18541000/ruby-on-rails-best-in-place-gem-throwing-error/18597396#18597396 – Bruno