【问题标题】:Updating ajax-datatables-rails table with results from custom ajax search使用自定义 ajax 搜索的结果更新 ajax-datatables-rails 表
【发布时间】:2015-07-17 07:39:07
【问题描述】:

我有一个简单的 dataTables 解决方案,使用 ajax-datatables-rails gem。它工作得很好,但我现在正在尝试实现一个解决方案,我可以在其中更新现有的数据表,并使用从自定义搜索表单调用的单独操作的结果。在我当前的代码中,控制器操作的一部分如下所示:

respond_to do |format|
   format.html
   format.json { render json: CasefileDatatable.new(view_context, {:user_id => current_user.id}) }
end

(目前没有使用user_id,只是测试从控制器传入...Datatable类)

CasefileDatatable 我有以下内容:

def data
    records.map do |record|
      [
          record.county.county_name,
          record.date.strftime("%m/%d/%y"),
          record.case_number,
          record.primary_property_address,
          record.table_json.to_s
      ]
    end
end    


def get_raw_records
    Casefile.all
end

最后一列 record.table_json.to_s 被隐藏。它包含我在后续处理中需要的内容。

Javascript:

var casefileTable = $('#casefiles-table').DataTable({
        "processing": true,
        "serverSide": true,
        "ajax": $('#casefiles-table').data('source'),
        "stateSave": false,
        "pagingType": 'full_numbers',
        columns: [
            {data: '0'},
            {data: '1'},
            {data: '2'},
            {data: '3'}
        ]
});

这一切都很好。然后我开始添加一个自定义搜索表单,因为这个模型更广泛,并且需要能够搜索可选属性,使用连接等跨多个模型。所以,我有另一个操作从表单中字段这个 ajax 请求然后在第一次尝试中使用 jbuilder 返回 json。我的策略是使用dataTable API直接操作现有的dataTable,并在我的表单中添加了相关的js调用... ajax:success handler,像这样:

//this seems to trigger a reset/refresh, so I arrive where I started
$('#casefiles-table').dataTable().fnClearTable();
$('#casefiles-table').dataTable().fnAddData(data);

然后是这些 dataTable 调用,它们什么也没做:

...
var dt = $('#casefiles-table').DataTable();
dt.clear().draw();
dt.rows.add(data);
dt.draw();
...

然后我突然想到,也许我可以返回一个不同的 Datatable 类,并在我的控制器中执行所有 AR 查询内容,然后传入 ActiveRecord_Relation 对象,然后在新的 CasefileSearchDatatableClass 中使用它,比如这个:

控制器动作返回:

  render json: CasefileSearchDatatable.new(view_context, {:query => finder})

然后在CasefileSearchDatatableget_raw_records

def get_raw_records
    results = options[:query]
    # following line was just to test passing in the query via options
    # p "search raw records results: #{results.size}"
    results
end

这类作品;正如 sql 日志和我的 p 语句所证明的那样,查询被触发了,但是,数据表没有用结果更新,也没有被清除;保持完全不变。

因此,我正在尝试找到更新此表的最佳方法,使用上述方法之一或在必要时使用完全不同的方法。此外,假设第一个目标是可能的,不确定如何最好地处理分页。感谢您的任何指点。

【问题讨论】:

    标签: ruby-on-rails datatables


    【解决方案1】:

    这段 JavaScript 代码应该可以工作(除了一个额外的 draw()),不知道为什么它没有:

    var dt = $('#casefiles-table').DataTable();
    dt.clear();
    dt.rows.add(data);
    dt.draw();
    

    我认为您使用单独的 Ajax 调用的方法行不通,因为您拥有启用了服务器端处理的 Ajax 源数据 ("serverSide": true)。因此,在您添加自定义过滤数据后,任何后续用户操作(排序、下一页/上一页)都将调用 $('#casefiles-table').data('source') 指定的 URL 并重置您的自定义过滤数据。

    解决方案

    使用自定义过滤控件,建议使用ajax.data 属性将自定义变量发送到服务器端脚本。例如:

    $('#casefiles-table').DataTable({
      "ajax": {
        "url":  $('#casefiles-table').data('source'),
        "data": function ( d ) {
            d.extra_search = $('#extra').val();
        }
      }
    });
    

    然后在服务器端检索这些自定义变量的值(例如,params.extra_search)并相应地调整您的查询。

    【讨论】:

    • 啊,这就是它被重置的原因;说得通。因此,使用“数据”:函数...方法,我仍然会使用相同的控制器操作,并移动我现有的搜索逻辑来提取参数,这些表单元素在该块中指定的位置?然后我可以采用相同的方法,将 ActiveRecord_Relation 的查询引用传递到我返回的 CasefileSearchDatatable 实例中?我想这就是你的提议?感谢您的帮助;至少回答了为什么表格在之后重置的问题。
    • @wkhatch,我不是 Ruby 专家,所以我只能在这里提出一般性的建议。是的,您需要将自定义搜索逻辑移动到处理数据表的同一控制器中,并在这些参数不为空时调整您的查询(添加额外的JOINWHERE 子句等)。
    • 明白了,谢谢你的澄清,Gyrocode。我试图理解,给定另一种形式,有几个元素和一个提交,这将如何在 function(d) 块中实际触发此更新?我可以很容易地得到其他表单元素 val();没问题,但是,不太了解我如何从包含表单提交操作中触发此块?我可以在表单提交中添加一个侦听器,所以我想知道我在该侦听器中调用的 dataTable 本身是否有一些函数会导致搜索/刷新?
    • @wkhatch,你需要使用ajax.reload()来触发另一个Ajax请求,看这个simplistic example
    • 好的,这就是我想要的。我会做一些重构,并希望让它工作。您将通过是否获得积分或其他问题来知道结果... ;-) 再次感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-01
    • 2013-03-17
    相关资源
    最近更新 更多