0

Ryan Bates RailsCast on DataTablesを自分のプロジェクトに適応させようとしていますが、サーバー側の処理を使用しています。インデックス ビューを呼び出すとヘッダーは正常に表示されますが、テーブルの本文には「テーブルにデータがありません」と表示されます。それでも、10K を超えるレコードがあります。私のプロジェクトは、表示される主なオブジェクトが遺伝子型であり、2 つの関連するテーブルがあるという点で例とは異なります。これが私の(の最初の部分)クラスGenotypesDatablesです(例のProductsDatablesに似ています):

class GenotypesDatatable
  delegate :params, :h, :link_to, to: :@view

  def initialize(view)
    @view = view
  end

  def as_json(options = {})
    # This is what feeds directly into DataTables
    {
      sEcho: params[:sEcho].to_i,
      iTotalRecords: Genotype.count,
      iTotalDisplayRecords: 20,
      aaData: data
    }
  end

private

  def data
    genotypes.map do |genotype|
      [
        # Note: h is shorthand for html_escape
        # Am unsure is this is correct way to call records; compare
        # to 340-datatables example.
        h(genotype.gmarker.marker),
        h(genotype.gsample.labid),
        h(genotype.gsample.subjectid),
        h(genotype.gsample.box),
        h(genotype.gsample.well),
        h(genotype.allele1),
        h(genotype.allele2),
        h(genotype.run_date)
      ]
    end
  end

Genotypes コントローラー (の関連部分) は次のとおりです。

class GenotypesController < ApplicationController
  # GET /genotypes
  # GET /genotypes.json
  def index
     respond_to do |format|
      format.html
      format.json { render json: GenotypesDatatable.new(view_context) }
    end
  end

これが問題を診断するのに十分なコードかどうかはわかりませんが、誰かがこの優れた宝石 (私のプロジェクトに最適です) に精通しており、さらにコードを確認する必要がある場合は、お知らせください。(私はいたるところにいましたが、答えが見つかりません..)ありがとう!

[コメントに基づいて編集を追加]

GenotypeDatatables の完全なクラスは次のとおりです。

class GenotypesDatatable
  delegate :params, :h, :link_to, to: :@view

  def initialize(view)
    @view = view
  end

  def as_json(options = {})
    # This is what feeds directly into DataTables
    {
      sEcho: params[:sEcho].to_i,
      iTotalRecords: Genotype.count,
      iTotalDisplayRecords: 20,
      aaData: data
    }
  end

private

  def data
    genotypes.map do |genotype|
      [
        # Note: h is shorthand for html_escape
        # Am unsure is this is correct way to call records; compare
        # to 340-datatables example.
        h(genotype.gmarker.marker),
        h(genotype.gsample.labid),
        h(genotype.gsample.subjectid),
        h(genotype.gsample.box),
        h(genotype.gsample.well),
        h(genotype.allele1),
        h(genotype.allele2),
        h(genotype.run_date)
      ]
    end
  end

  def genotypes
    @genotypes ||= fetch_genotypes
  end

  def fetch_genotypes
    genotypes = Genotype.order("#{sort_column} #{sort_direction}")
    genotypes = genotypes.page(page).per_page(per_page)
    if params[:sSearch].present?
      genotypes = genotypes.where("labid like :search or category like :search", search: "%#{params[:sSearch]}%")
    end
  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[allele1 allele2 run_date]
    columns[params[:iSortCol_0].to_i]
  end

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

/app/assets/javascript/genotypes.js.coffee にある JavaScript ファイルは次のとおりです。

jQuery ->
    $('#genotypes').dataTable
    bJQueryUI: true
    bProcessing: true
    bServerSide: true
    bDeferRender: true
    "sAjaxSource": $('#genotypes').data('source')

そして、ここに私がデータテーブルをレンダリングしようとしているビューがあります:

<h1>Listing genotypes</h1>

<table id="genotypes" class="display" data-source="<%= genotypes_url(format: "json") %>">
  <thead>
    <tr>
      <th>Marker</th>
      <th>LabID</th>
      <th>SubjectID</th>
      <th>Box</th>
      <th>Well</th>
      <th>Allele1</th>
      <th>Allele2</th>
      <th>Run date</th>
    </tr>
  </thead>
  <tbody>
</tbody>
</table>

<br />

さらにコードが必要な場合はお知らせください...ありがとう!

4

0 に答える 0