【问题标题】:Search Function For Server-Side jQuery DataTable Error服务器端 jQuery DataTable 错误的搜索功能
【发布时间】:2015-10-25 23:48:24
【问题描述】:

我已经将我的 jQuery DataTable 从客户端转换到服务器端,以更快地加载 1000 多个数据。

但是我在如何实现服务器端搜索时遇到了困难,因为不是一次加载所有数据。

我在关注 railscast (http://railscasts.com/episodes/340-datatables)

app/datatables/wine_list_datatable.rb

class WineListsDatatable
  delegate :params, :link_to, :number_to_currency, :content_tag, to: :@view

  def initialize(view)
    @view = view
  end

  def as_json(options = {})
    {
      sEcho: params[:sEcho].to_i,
      iTotalRecords: WineList.count,
      iTotalDisplayRecords: wine_lists.total_entries,
      aaData: data
    }
  end

private

  def data
    wine_lists.map do |wine_list|
      [
        (wine_list.vintage),
        (wine_list.name),
        (wine_list.region),
        (wine_list.country.name),
        (wine_list.wine_maker.name),
        link_to('profile', wine_list.wine_maker),
        (wine_list.score),
        link_to('delete', wine_list, :method => "Delete", data: {confirm: "Are you sure?"}),
        link_to('edit', [:edit, wine_list])
      ]
    end
  end

  def wine_lists
    @wine_lists ||= fetch_wine_lists
  end

  def fetch_wine_lists
    wine_lists = WineList.order("#{sort_column} #{sort_direction}")
    wine_lists = wine_lists.page(page).per_page(per_page)
    if params[:sSearch].present?
      wine_lists = wine_lists.where("name like '%?%'", search: params[:sSearch])
    end
    wine_lists
  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 category released_on price]
    columns[params[:iSortCol_0].to_i]
  end

  def sort_direction
    params[:sSortDir_0] == "desc" ? "desc" : "asc"
  end
end

我感到困惑的那一行是在

      wine_lists = wine_lists.where("name like '%?%'", search:  params[:sSearch])

目前,我收到 2 个错误。

DataTables 警告:表 id=wine_lists - Ajax 错误。有关此错误的更多信息,请参阅http://datatables.net/tn/7

谢谢!

【问题讨论】:

    标签: jquery ruby-on-rails ruby ajax datatable


    【解决方案1】:

    该行的语法错误。 Railscast 中的搜索查询是这样的:

    products = products.where("name like :search or category like :search", search: "%#{params[:sSearch]}%")
    

    但你的线是

    wine_lists = wine_lists.where("name like '%?%'", search: params[:sSearch])
    

    解决方案是更改'%?%'

    wine_lists = wine_lists.where("name like '%#?%'", params[:sSearch])
    

    或关注 Railscast:

    wine_lists = wine_lists.where("name like :search", search: "%#{params[:sSearch]}%")
    

    请注意,jQuery Datatable 已更新到 1.10,其中对参数命名进行了重大更改。它仍然兼容 Railscast 中使用的 1.9 命名,但如果您想升级到 1.10,here 是参数新命名的参考。

    【讨论】:

    • 当我第一次关注 Railscast 时,它给了我同样的错误。所以我改为 "wine_lists = wine_lists.where("name like '%#?%'", params[:sSearch])" 。但是那个语法不起作用,所以我包括了“搜索:”,但它仍然给了我同样的错误。在railscast中,有“name like”和“category like”,这是否意味着我需要创建一个名为“name”和“category”的迁移?感谢您的帮助!
    • @j.sanghoon 这取决于您要搜索的表格的哪一列。例如,如果您希望根据酒名进行搜索,则需要酒单表中的名称列。如果您可以发布您的 WineList 模型,加载 DataTable 时 Rails 日志中显示哪些参数,以及 Rails 日志中显示哪些错误,这将是一个很大的帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-09
    相关资源
    最近更新 更多