Javascript, похоже, не получает данные из источника рельсов
Я использую dataTables для отображения хорошей таблицы для отображения различной информации. Javascript успешно отправляет запросы на опрос в базу данных / веб-сервер, однако Javascript, похоже, не получает никаких текущих данных.
Вот мой контроллер
class CommentsController < ApplicationController
before_filter :authenticate_user!
before_filter :get_current_user
# GET /comments
# GET /comments.json
def get_current_user
@user=current_user
end
def index
@comments = @user.comments
respond_to do |format|
format.html # index.html.erb
format.json { render json: @comments }
end
end
Посмотреть:
<h1>Listing comments</h1>
<table id="comments_id" class="display">
<thead>
<tr>
<th>String</th>
<th>secondString</th>
<th></th>
<th></th>
</tr>
</thead>
<tbody>
</tbody>
</table>
<br />
<%= link_to 'New Comment', new_comment_path %>
<h1>Listing comments</h1>
<table id="comments_id" class="display">
<thead>
<tr>
<th>State</th>
<th>Environment</th>
<th>dns</th>
<th></th>
<th></th>
<th></th>
</tr>
</thead>
<tbody>
</tbody>
</table>
<br />
<%= link_to 'New Comment', new_comment_path %>
<h1>Listing comments</h1>
<table id="comments_id" class="display">
<thead>
<tr>
<th>State</th>
<th>Environment</th>
<th>dns</th>
<th></th>
<th></th>
<th></th>
</tr>
</thead>
<tbody>
</tbody>
</table>
<br />
<%= link_to 'New Comment', new_comment_path %>
comments.js:
function InitOverviewDataTable()
{
oOverviewTable =$('#desktops_id').dataTable(
{
"bPaginate": true,
"bJQueryUI": true, // ThemeRoller-stöd
"bLengthChange": false,
"bFilter": false,
"bSort": false,
"bInfo": true,
"bAutoWidth": true,
"bProcessing": true,
"iDisplayLength": 10,
"sAjaxSource": 'desktops'
});
}
function RefreshTable(tableId, urlData)
{
$.getJSON(urlData, null, function( json )
{
table = $(tableId).dataTable();
oSettings = table.fnSettings();
table.fnClearTable(this);
for (var i=0; i<json.aaData.length; i++)
{
table.oApi._fnAddData(oSettings, json.aaData[i]);
}
oSettings.aiDisplay = oSettings.aiDisplayMaster.slice();
table.fnDraw();
});
}
function AutoReload()
{
RefreshTable('#desktops_id', 'desktops');
setTimeout(function(){AutoReload();}, 3000);
}
$(document).ready(function () {
InitOverviewDataTable();
setTimeout(function(){AutoReload();}, 3000);
});
Я вижу правильные запросы, выдвигаемые на стороне базы данных:
Started GET "/comments" for 127.0.0.1 at 2013-01-22 18:46:16 -0500
Processing by CommentsController#index as JSON
User Load (0.5ms) SELECT "users".* FROM "users" WHERE "users"."id" = 1 LIMIT 1
Comment Load (0.4ms) SELECT "comments".* FROM "comments" WHERE "comments"."user_id" = 1
Completed 200 OK in 6ms (Views: 3.2ms | ActiveRecord: 0.9ms)
Однако в веб-консоли firefox я вижу, что во время опроса данные не извлекаются... и когда dataTable застревает при "загрузке данных"
[19:04:37.395] GET http://localhost:3000/comments?_=1358899476292 [HTTP/1.1 200 OK 38ms]
[19:04:39.344] GET http://localhost:3000/comments [HTTP/1.1 304 Not Modified 15ms]
[19:04:42.360] GET http://localhost:3000/comments [HTTP/1.1 304 Not Modified 18ms]
Спасибо за вашу помощь
1 ответ
Проблема в том, что данные JSON, поступающие с вашего сервера, не имеют значения ключа aaData
потому что вы сериализуете ActiveRecord
объекты.
Я бы вообще изменил способ использования плагина DataTable, потому что похоже, что вы используете внутренние API (например, _fnAddData
), что немного противно.
Вместо этого я бы рекомендовал подход, который Райан Бейтс показывает в своем RailsCast #340 на Datatables. Этот способ работал очень хорошо для меня, и у меня никогда не было проблем с этим.