2016年2月15日月曜日

JQueryのDataTablesプラグインを使って、データをテーブル形式で画面に表示してみる

こんにちは、井下です。


今回はDataTablesというプラグインを使い、データをテーブル形式で画面に表示してみます。
ちなみにデータを画面に表示するためにRailsを利用していますが、Rails自体の説明は省略しますので、あしからず。

DataTablesとは

DataTablesはjQueryのプラグインとして提供されるオープンソースで、画面上でデータをテーブルの形式として表示するものです。
Ajaxで動的にデータを取得することもでき、テーブル表示実装の手間を大いに軽減してくれます。

公式URL : https://www.datatables.net/




Railsでの一覧(indexアクション)の初期表示

Railsで表示するデータと画面を作成します。
今回は例として"library"アプリケーションを作成し、scaffoldジェネレータで"Books"モデルおよびコントローラ、ビュー等を自動生成しました。

※ Booksモデル作成時に、以下のカラムを設定しました。
カラム名 概要
title 本のタイトル string
author 本の著者 string
genre 本のジャンル string
page 本のページ数 integer
publication 本の発効日 date


その後画面を介して本の情報を入力した一覧画面(indexアクション)はこんな感じになります。



自動生成される画面なので、データが並べてあるだけの状態です。
この画面をDataTablesを使い、きちんとしたテーブル形式でデータを表示していきます。




画面にDataTablesを適応してみる

まずはDataTablesを画面に適応します。
DataTablesのDownLoadページ下部に"Package results"と記載されたテキストエリアがあるので、その中の文字をコピーします。



次に自動生成されたindex.html.erbを開き、ファイルの一番上にコピーした文字をペーストします。
※簡潔にDataTablesを実行するために、index.html.erbに直接書き込む手法にしています。
  以降もJavaScriptをindex.html.erbに直接書き込む箇所がありますが、cssやJavaScriptの読み込みを別途管理している場合、そちらの方法に沿って必要なファイルを読み込み・実行させるように読み替えてください。

<link rel="stylesheet" type="text/css" href="https://cdn.datatables.net/s/dt/jq-2.1.4,dt-1.10.10/datatables.min.css"/>
<script type="text/javascript" src="https://cdn.datatables.net/s/dt/dt-1.10.10/datatables.min.js"></script>

<p id="notice"><%= notice %></p>

<h1>Listing Books</h1>

<table>
  <thead>
~ 略 ~

最後にindex.html.erb内の<table>タグに任意のIDを設定します。例として、"books_table"と設定しました。
<link rel="stylesheet" type="text/css" href="https://cdn.datatables.net/s/dt/jq-2.1.4,dt-1.10.10/datatables.min.css"/>
<script type="text/javascript" src="https://cdn.datatables.net/s/dt/jq-2.1.4,dt-1.10.10/datatables.min.js"></script>

<p id="notice"><%= notice %></p>

<h1>Listing Books</h1>

<table id="books_table">
  <thead>
~ 略 ~



ここまでの設定の後、再度ブラウザで一覧画面を開きます。

今の段階だと、"DataTablesプラグインを読み込んだ"だけで、"テーブル形式で表示"していないため、画面上には変化はありません。



では、ブラウザのデベロッパーツールを利用して、"テーブル形式で表示する"ことをしてみます。
Chromeの場合は[その他のツール]>[デベロッパーツール]を選択すると、ブラウザ下部もしくは右にデベロッパーツールが展開します。
(Chorme以外のブラウザでも用意されていることがほとんどなので、開き方は自分で調べてください)



デベロッパーツールが展開したら、メニューの"console"(コンソール)を選択します。


もしもデベロッパーツールのコンソールで"Uncaught ReferenceError: jQuery is not defined"というエラー(赤字のメッセージ表示)が発生していた場合、DataTablesの実行前提として必要なjQueryが読み込めていません。
Railsから作成していれば、デフォルトで読み込み設定しているので発生しないと思いますが、もしも発生した場合、index.html.erbに下記の修正を行います。(Rails以外でHTMLを作成している場合も、同様の修正で構いません)

<link rel="stylesheet" type="text/css" href="https://cdn.datatables.net/s/dt/jq-2.1.4,dt-1.10.10/datatables.min.css"/>
<script src="http://code.jquery.com/jquery-2.2.0.min.js"></script>
<script type="text/javascript" src="https://cdn.datatables.net/s/dt/dt-1.10.10/datatables.min.js"></script>

<p id="notice"><%= notice %></p>

<h1>Listing Books</h1>

<table id="books_table">
  <thead>
~ 略 ~


デベロッパーツールのコンソールで特にエラーがないようであれば、コンソールに次の入力を行ってからEnterキーをクリックします。
("#books_table"は"#自分で設定したID"に置き換えてください)

$("#books_table").DataTable()


すると、ただデータが表示されていた画面がテーブルっぽくなりました!


同時にコンソールにエラー発生が出てきました!


テーブル"っぽく"と表現しましたが、DataTablesの公式ページに載っているテーブルは検索用のボックスがありますし、ページ数の表示、表示数の切り替え用ボックスなどが表示されていました。
これらは特にオプションを指定しなければ、デフォルトで表示されるようになっています。

なので、今の段階では"テーブル形式で表示する"ことはしていますが、コンソールで発生を通知しているエラーが原因で、中途半端な状態になっています。


エラーの原因ですが、これはRailsで自動生成されたindex.html.erb内のテーブルが、DataTablesが求めるテーブルの基本の書き方と合致していないところがあるためです。

具体的にはindex.html.erb内で下記のように<th>タグをcolspanによって連結しているところです。
~ 略 ~
<table id="books_table">
  <thead>
    <tr>
      <th>Title</th>
      <th>Author</th>
      <th>Genre</th>
      <th>Page</th>
      <th>Publication</th>
      <th colspan="3"></th>
    </tr>
  </thead>

  <tbody>
~ 略 ~

画面で言えば、"Show"、"Edit"、"Destroy"などのリンクのヘッダ部分です。

DataTablesでは、基本的にカラムのヘッダ部分と、データ部分のカラム数が同じであることを求める仕様となっています。
Railsで自動生成されたindex.html.erb内のテーブルでは、上記のヘッダの連結により、ヘッダ部分とデータ部分の数が不一致の状態であり、そのためエラーが発生してしまいました。

解決方法としては、ヘッダ部を増やせばいいので、colspanの連結を止めて、単純に<th>タグを3つ並べるようにしました。
~ 略 ~
<table id="books_table">
  <thead>
    <tr>
      <th>Title</th>
      <th>Author</th>
      <th>Genre</th>
      <th>Page</th>
      <th>Publication</th>
      <th></th>
      <th></th>
      <th></th>
    </tr>
  </thead>

  <tbody>
~ 略 ~


index.html.erbを修正した後、先ほど入力したコマンドをコンソールから実行すると、今度はエラーなしで画面にテーブルが表示されるようになりました!



検索用ボックスをはじめ、ページ数の表示、表示数の切り替え用ボックスが表示されていますね。


最後はわざわざコンソールからコマンドを実行しなくても済むよう、画面を開いた際にコマンドを実行させるようにします。

index.html.erbに下記の修正を行います。
~ 略 ~
</table>

<br>

<%= link_to 'New Book', new_book_path %>
<script>
$(document).ready(function() {
  $('#books_table').DataTable();
});
</script>

これで画面を開いただけで、テーブル形式でデータを画面に表示するようになりました。


次回はDataTablesのオプションなどの話や、Ajax連携についてを書こうかと考えています。

0 件のコメント:

コメントを投稿