我知道此问题之前已被多次询问过,但由于我的经验不足,我无法使用这些答案纠正问题。我让它在之前的Rails项目中工作,看不到发生了什么变化。我使用PostgreSQL而不是MySQL开始了一个新项目,我现在使用的是Rails 3.2.8(3.2.1)。
Firebug显示: TypeError:aData未定义于:
var aData = _fnGetObjectDataFn( oSettings.sAjaxDataProp )( json );
for ( var i=0, iLen=aData.length ; i<iLen ; i++ )
我认为这可能是因为Datatables没有得到正确的JSON。下面显示了一个片段,该片段在JSONLint中验证。
[{"code":"STATE 30","created_at":"2012-12-10T06:01:34Z","id":1,"name":"ALBANY HIGHWAY","rank":null,"state":"WA","updated_at":"2012-12-10T06:01:34Z"},{"code":"ANNE BEADELL HIGHWAY","created_at":"2012-12-10T06:01:34Z","id":2,"name":"ANNE BEADELL HIGHWAY","rank":null,"state":"SA","updated_at":"2012-12-10T06:01:34Z"},...
我发现它不包括iTotalRecords,iTotalDisplayRecords和aaData。这是问题吗?我假设JSON选项是由def as_json设置的,在我的渲染中我买不到明确的引用?? http get(如Firebug中所示)包括sEcho但不包括iTotalRecords。
我的代码基于RailsCasts#340:
控制器:(参见列表操作)。
class HighwaysController < ApplicationController
respond_to :html, :json
def index
@highways = Highway.all
respond_to do |format|
format.html # index.html.erb
format.json { render json: @highways }
end
end
def list
@highways = Highway.all
logger.debug "Highway Count: #{@highways.size}"
respond_to do |format|
format.html # index.html.erb
format.json { render json: HighwaysDatatable.new(view_context)}
end
end
相关的Ruby代码:
class HighwaysDatatable
delegate :params, :h,:link_to,:number_to_currency,to: :@view
def initialize(view)
@view = view
end
def as_json(options = {})
{
sEcho: params[:sEcho].to_i,
iTotalRecords: Highway.count,
iTotalDisplayRecords: highways.total_entries,
aaData: data
}
end
private
def data
highways.map do |highway|
[
h(highway.id),
h(highway.name),
h(highway.state),
h(highway.code),
h(highway.rank),
h(highway.created_at),
h(highway.updated_at)
]
end
end
def highways
@highways ||= fetch_highways
end
def fetch_highways
... (as per RailsCasts code - code wrapped and did not show properly)
end
highways
end
def page
params[:iDisplayStart].to_i/per_page + 1
end
def per_page
params[:iDisplayLength].to_i > 0 ? params[:iDisplayLength].to_i : 10
end
def sort_column
columns = %w[name state code rank]
columns[params[:iSortCol_0].to_i]
end
def sort_direction
params[:sSortDir_0] == "desc" ? "desc" : "asc"
end
end
和列表视图:
<% @page_title = "Highways List" %>
<h2>Highways</h2>
<%= javascript_tag do %>
window.highwaysURL = '<%= j highways_url %>';
<% end %>
<div id="EditLink">
<%= link_to "Edit Highway", :controller => :highways, :action => :edit, :id => 1 %>
</div>
<div>
</br>
<%= link_to 'Neighbours', '/neighbours/' %>
<%= link_to 'Localities', '/localities/' %>
</br>
</div>
<div id="tools">
</div>
<table id="highways" class="display" data-source="<%= highways_url(format: "json") %>">
<thead>
<tr>
<th>Id</th>
<th>Highway</th>
<th>State</th>
<th>Code</th>
<th>Rank</th>
<th>Created At</th>
<th>Updated At</th>
</tr>
</thead>
<tbody>
</tbody>
</table>
<div id=editarea class='result' ></div>
我的gemfile(删除了评论):
source 'https://rubygems.org'
gem 'rails', '3.2.8'
gem 'pg'
group :assets do
gem 'sass-rails', '~> 3.2.3'
gem 'coffee-rails', '~> 3.2.1'
gem 'uglifier', '>= 1.0.3'
end
gem 'libv8', '~> 3.11.8'
gem 'therubyracer', require: 'v8'
gem 'jquery-rails'
gem 'will_paginate'
gem 'debugger'
和Asset Pipeline的application.js:
//= require jquery
//= require jquery-ui
//= require jquery.dataTables
//= require TableTools
//= require ZeroClipboard
//= require datatable_highways
//= require datatable_localities
//= require datatable_neighbours
//= require_tree .
这可能很简单,但它已经让我坚持了一段时间。感谢您的期待。
更新
DataTables调试器bookmarklet指示'list'视图呈现以下内容,其中不包含DataTables期望的json参数。
http://localhost:3000/highways.json
我认为应该是:
http://localhost:3000/highways/list.json.
我不确定这是控制器还是视图问题。
更新
我做了各种更改,但仍然遇到同样的问题。但是我在日志中看到两件很重要的事情:
输入localhost:3000 / highways / list表示会呈现2个视图。
Processing by HighwaysController#list as HTML [1m[36mHighway Load (4.8ms)[0m [1mSELECT "highways".* FROM "highways" ORDER BY name
Highway Count: 229
Rendered highways/list.html.erb within layouts/highways (32.6ms)
然后
Processing by HighwaysController#index as JSON
Parameters: {"sEcho"=>"1", "iColumns"=>"5", "sColumns"=>"", "iDisplayStart"=>"0",...
第一个是HTML(通过动作'列表'),第二个是JSON(通过动作'索引')。
所以有两个问题:
第一个渲染有一个关联的数据请求,导致一个 来自DataTables的“已初始化”警告和
我的routes.rb显式匹配语句正在捕获要呈现的HTML 视图,但JSON响应(来自对数据行的AJAX调用)落空 并由资源处理:高速公路,然后使用'索引' 控制器中的动作
的routes.rb
match 'highways/list'=> 'highways#list'
...
resources :highways
当我只想渲染视图(列标题等)时,如何停止数据请求?
将JSON响应发送到控制器中的“list”操作需要什么路由?
答案 0 :(得分:0)
解决。回到最小的设置,使用Ryan Bates#340代码的1个表 - 所以使用索引操作/视图来解决上面的2渲染问题。还是行不通。删除了gem到rweng github并将DataTables文件加载到./vendor/assets。现在有效。索引或列表操作可能可以通过显式路由修复,但当我尝试通过列表操作强制它时,我无法通过“缺少模板”。