javascript - Rails 数据表选择过滤器

标签 javascript jquery ruby-on-rails datatable coffeescript

我的 SKU 有一个 ajax 数据表。为此,我使用 ajax-datatables-rails gem。搜索和排序工作完美,但现在我试图向我的表添加过滤功能,但它似乎没有做任何事情。我用这个例子作为过滤器函数:https://datatables.net/examples/api/multi_filter_select.html 。 在示例中,选择框绘制在页脚中,但对我来说页脚是空的。就像代码根本没有运行一样。我也没有收到任何错误。

我在 Coffeescrip 文件 (assets/javascripts/vendor_skus.js.coffee) 中初始化数据表,因此我必须将其转换为 Coffeescript。我没有使用 Coffeescript 或使用 ajax 与 Rails 的经验,所以我有点迷失了什么问题。

我如何解决我的问题:

标准选择框对于我的情况来说是有问题的,因为我在表中使用 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 %>

这是我的 CoffeeScript ,用于使 jQuery 将参数提交到服务器并在更改时重新加载表:

$ ->
  $('#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   

在 Controller 中,确保将参数传递到数据表,如下所示:

respond_to do |format|
  format.html
  format.json { render json: OrderDatatable.new(view_context, { store_id: params[:store_id], status: params[:status] }) }
end

然后在数据表文件中,使用参数来过滤结果。在本例中,我对状态使用多重选择,因此当选择空白值时,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

最佳答案

我在实现这个时遇到了同样的问题。我发现问题出在这一行:

column.search((if val then '^' + val + '$' else ''), true, false).draw()

CoffeeScript 不喜欢以下内容:

, true, false

像这样删除它后:

column.search(if val then '^' + val + '$' else '').draw()

一切顺利。需要注意的是,我不是一个 javascript/coffeescript 人,所以结果造成的负面影响超出了我的范围。但和你一样,我目前正在努力让所有结果出现在可选择的下拉过滤器中。它仅显示当前数据页中的任何唯一值 - 这没有帮助。

仅供引用,要使分页正常工作,请转到 datatable.rb 文件并取消注释指向您正在使用的分页的顶部的正确行。我使用“will_paginate”进行引导,所以我的看起来像这样:

  include AjaxDatatablesRails::Extensions::WillPaginate

希望有帮助。偶然,您是否找到了一种在选择过滤器中显示所有结果的方法?

关于javascript - Rails 数据表选择过滤器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37738430/

相关文章:

JavaScript:折叠无限流(生成器函数)

javascript - 使用 jQuery 获取格式化的日期和时间

jquery - 这个选择器在 jquery 中起什么作用?

ruby-on-rails - Rails 3.2/4 : Is there a way to easily render a template (partial, 什么...)来自控制台?

ruby-on-rails - 将两个实例变量传递给 js.erb 文件?

ruby-on-rails - 自定义密码恢复装置

javascript - 如何根据 MySQL 数据库中存储的坐标显示动画多个标记

javascript - 如何在移动 Safari 中提交表单后重置缩放,同时保持用户可扩展性?

javascript - 如何在 NodeJs 中使用 Excel4node 模块在单元格内添加断线

javascript - 同一 iFrame 中具有不同显示时间的多个 HTML 页面