【发布时间】:2016-10-10 20:13:21
【问题描述】:
我的 SKU 有一个 ajax 数据表。为此,我使用了 ajax-datatables-rails gem。搜索和排序工作完美,但现在我试图在我的表中添加一个过滤功能,它似乎没有做任何事情。我将此示例用于过滤功能:https://datatables.net/examples/api/multi_filter_select.html。 在示例中,在页脚中绘制了选择框,但对我来说,页脚是空的。就像代码根本不运行一样。我也没有收到任何错误。
我在我的咖啡脚本文件 (assets/javascripts/vendor_skus.js.coffee) 中初始化了我的数据表,所以我不得不将它翻译成咖啡脚本。我没有使用咖啡脚本或使用带有rails的ajax的经验,所以我对出了什么问题感到有点迷茫。
我是如何解决我的问题的:
标准选择框对我的情况有问题,因为我在我的表中使用 AJAX,并且选择框似乎只能在客户端表上正常工作。我决定制作自己的自定义过滤器,而不是使用标准选择框。这些是常规选择框,如下所示:
<%= select_tag "store-id", options_from_collection_for_select(@stores, "id", "name"), include_blank: true, class:"store-id form-control" %>
<%= select_tag "status", options_for_select([ "Open", "On Hold", "Cancelled", "Closed", "Error" ]), include_blank: true, class:"form-control", multiple:true %>
这是我的咖啡脚本,用于让 jQuery 将参数提交到服务器并重新加载表 onchange:
$ ->
$('#orders-table').DataTable
processing: true
serverSide: true
retrieve: true
pageLength: 50
title: 'orders'
lengthMenu: [[10, 25, 50, -1], [10, 25, 50, "All"]]
ajax: data: (d) ->
d.store_id = $('#store-id').val();
d.status = $('#status').val();
return
$ ->
$('#store-id').on 'change', ->
$('#orders-table').DataTable().ajax.reload()
return
$ ->
$('#status').on 'change', ->
$('#orders-table').DataTable().ajax.reload()
return
在您的控制器中,确保将参数传递给数据表,如下所示:
respond_to do |format|
format.html
format.json { render json: OrderDatatable.new(view_context, { store_id: params[:store_id], status: params[:status] }) }
end
然后在您的 Datatable 文件中,使用参数过滤您的结果。在这种情况下,我正在使用多选择的状态,因此在选择空白值时,Params [:status] .present?结果为真。这就是为什么我添加了一个检查以查看第一项是否为空字符串。
def get_raw_records
# insert query here
query = Order.all
query = query.status(params[:status]) if params[:status].present? && (params[:status].count == 1 && params[:status][0] == "") == false
query = query.store(params[:store_id]) if params[:store_id].present?
query.joins(:store)
end
【问题讨论】:
-
(1) 如果您不想使用 CoffeeScript,则不必使用,您仍然可以使用纯 JavaScript。 (2) 你的 CoffeeScript 中的缩进是正确的吗?
-
我更新了我的缩进。尝试使用纯 javascript 并且它有效,但它没有考虑分页(因此只有第一页中的值可以在下拉列表中选择)。此外,下拉列表中的值不等于我表中的值,因此搜索始终导致 0 个结果。我想我会考虑构建一个自定义过滤器
标签: javascript jquery ruby-on-rails datatable coffeescript