Rubyフレームワーク「Ruby on Rails」でWijmoを使う

以前公開した記事では、RubyのWebアプリケーションフレームワーク「Ruby on Rails」の導入方法、および簡単なWeb APIを作成する方法をご紹介しました。

今回は弊社が提供するJavaScript開発ライブラリ「Wijmo(ウィジモ)」のデータグリッドコントロール「FlexGrid」をRuby on Railsに組み込んで、CRUD処理を行うアプリケーションを作成してみたいと思います。

開発環境

  • Ruby 3.1.2
  • Rails 7.0.3.1

静的アセットの管理

これまでRailsにおけるJavaScriptなどの静的アセットの管理には「Webpacker」が使用されてきましたが、最新バージョンの「Rails 7.0」ではフロントエンド開発の環境に大きな変更が加えられており、新しいgem「importmap-rails」がデフォルトで使用されるようになりました。

importmap-railsではNode.jsを必要とせず、またwebpackのようなバンドラも使いません。ブラウザから直接JavaScriptモジュールをインポートしてJavaScriptアプリケーションを構築できます(インポートするモジュールはES modulesに対応している必要があります)。

また、これまでのようにバンドラを使用したい場合は、新しく「jsbundling-rails」というgemも用意されています。

こちらはWebpackerと比較して機能が削ぎ落されておりますが、webpackだけでなくesbuildやrollupといったバンドラが使用できます。また、Railsにおける従来の静的アセットの管理機能である「Sprockets」と一緒に使用できます。

今回はRails 6.0まで主流だったWebpackerからの移行も容易な、「jsbundling-rails」を使用してアプリケーションを開発してみたいと思います。

アプリケーションの作成

まずはRuby on Railsでアプリケーションを作成していきます。今回は前回作成したWeb APIの部分とは別にアプリケーションを作成して連携させてみたいと思います。以下のコマンドを実行して「wijmo-rails-app」という名前でアプリケーションを追加します。デフォルトではimportmap-railsが有効になってしまうため、jsbundling-railsとwebpackを使用するように引数を設定します。

rails new wijmo-rails-app -j webpack

各種パッケージのインストール

次に作成された「wijmo-rails-app」フォルダに移動し、以下のコマンドを実行してスタイルシートを読み込むためのローダーをインストールします。

npm install -D style-loader css-loader

続けてWijmoのパッケージをインストールします。フロントエンドにAngularなどのJavaScriptフレームワークを使用する場合には、以下のように個別に専用のパッケージが用意されています。

  • Angular:@grapecity/wijmo.angular2.all
  • React:@grapecity/wijmo.react.all
  • Vue:@grapecity/wijmo.vue2.all
  • 使用しない:@grapecity/wijmo.purejs.all

今回はJavaScriptフレームワークは使用せず、Railsの標準のビューを使用しますので、「@grapecity/wijmo.purejs.all」をインストールします。

npm install @grapecity/wijmo.purejs.all

ビューの作成

以下のコマンドを追加して「wijmo」コントローラーと「index」アクションを作成します。

rails g controller wijmo index

「app/views/wijmo/index.html.rb」を以下のように書き換えます。

<div id="flexGrid" style="height: 600px;"></div>

JavaScriptの追加

「app/javascript/application.js」に以下の内容を追加します。まずはWeb APIとの連携は行わず、固定値のデータを表示させてみます。

import "@hotwired/turbo-rails"
import "./controllers"
import '@grapecity/wijmo.styles/wijmo.css';
import '@grapecity/wijmo.cultures/wijmo.culture.ja';
import * as wjGrid from '@grapecity/wijmo.grid';
let flexGrid = new wjGrid.FlexGrid('#flexGrid', {
    itemsSource: getData(),
    columns: [
        { binding: 'id', header: 'ID', width: 80},
        { binding: 'product', header: '商品名', width: 200},
        { binding: 'date', header: '受注日' },
        { binding: 'amount', header: '金額', format: 'c0' }
    ]
});
function getData() {
    return [
        { id: 15, product: 'ピュアデミグラスソース', date: '2022/01/10', amount: 6000 },
        { id: 17, product: 'だしこんぶ', date: '2022/01/08', amount: 14500 },
        { id: 18, product: 'ピリカラタバスコ', date: '2022/01/12', amount: 4000 },
        { id: 84, product: 'なまわさび', date: '2022/01/21', amount: 8000 },
    ];
}

静的アセットのバンドル

「webpack.config.js」に以下の設定を追加し、Wijmoのスタイルシートをバンドルできるように設定します。

const path    = require("path")
const webpack = require("webpack")

module.exports = {
  mode: "production",
  devtool: "source-map",
  entry: {
    application: "./app/javascript/application.js"
  },
  output: {
    filename: "[name].js",
    sourceMapFilename: "[name].js.map",
    path: path.resolve(__dirname, "app/assets/builds"),
  },
  plugins: [
    new webpack.optimize.LimitChunkCountPlugin({
      maxChunks: 1
    })
  ],
  module: {
    rules: [
      { test: /\.css$/, use: ["style-loader", "css-loader"] },
    ],
  },
}

以下のコマンドを実行してJSファイルとCSSファイルをwebpackでバンドルします。

npm run build

完了すると「app/assets/application.js」にバンドルした結果が出力されます。

アプリケーションの実行

以下のコマンドを実行してアプリケーションを起動します。

rails s

「http://127.0.0.1:3000/wijmo/index」にアクセスすると、以下のようにブラウザ上にWijmoのFlexGridが表示できます。

FkexGridの表示

CRUD処理の追加

次にWeb APIと連携し、WijmoのFlexGrid上からCRUD処理を実行できるようにコードを追加していきます。「app/javascript/application.js」を以下のように修正し、Wijmoのコアモジュールへの参照を追加します。また、Wijmoのデータ管理クラス「CollectionView」を使用してグリッド上のデータの変更箇所の追跡ができるようにします。
さらに、連携するAPIにあわせてバインドするフィールドをそれぞれ定義し直します。

import "@hotwired/turbo-rails"
import "./controllers"
import '@grapecity/wijmo.styles/wijmo.css';
import '@grapecity/wijmo.cultures/wijmo.culture.ja';
import * as wjGrid from '@grapecity/wijmo.grid';
import * as wjCore from '@grapecity/wijmo';

let cv = new wjCore.CollectionView();
cv.trackChanges = true;
let flexGrid = new wjGrid.FlexGrid('#flexGrid', {
    itemsSource: cv,
    allowAddNew: true,
    allowDelete: true,
    autoGenerateColumns: false,
    columns: [
        { binding: 'id', header: 'ID', width: 80 },
        { binding: 'billno', header: '請求書番号' },
        { binding: 'slipno', header: '伝票番号' },
        { binding: 'customerid', header: '顧客番号', width: 80 },
        { binding: 'customername', header: '顧客名', width: 250 },
        { binding: 'products', header: '商品名', width: 250  },
        { binding: 'unitprice', header: '単価', width: 100 , format: 'c0' },
        { binding: 'number', header: '数量', width: 100 },
        { binding: 'date', header: '受注日', width: 180 , dataType: 'Date', format: 'yyyy-MM-dd' }
    ]
});
・・・(中略)

データの読み込み(READ)を行う

次に同ファイルに、連携するWeb APIのURLを定義し、データの読み込み(READ)の処理を記述します。
Web APIにGETリクエストを送信して、リクエストが成功したときに読み込んだJSONデータを「JSON.parse」メソッドでJavaScript配列オブジェクトに変換してCollectionViewに設定してFlexGridに表示します。
この時、JSON.parseメソッドの第二引数に関数を設定することで、シリアライズ処理中のデータ加工が可能になります。今回設定している「reviver」関数では日付項目が格納されたstring型の項目に対し、Date型に変換する処理を行っています。

・・・(中略)
let url = 'http://127.0.0.1:3000/api/v1/invoices/';

//GET(データの読み込み)
wjCore.httpRequest(url, {
    success: function (xhr) {
        cv.sourceCollection = JSON.parse(xhr.response, reviver);
    }
});

function reviver(key, val) {
    // 先頭から"yyyy-mm-ddT"の文字列を日付データと判断 
    if (typeof (val) == "string" &&
        val.match(/^\d{4}-\d{2}-\d{2}T.*/)) {
        return new Date(Date.parse(val)); // Date型に変換
    } return val;
}

あらかじめ前回作成したWeb APIを起動し、その後に以下のコマンドを実行してアプリケーションを実行します。その際、「-p」オプションとポート番号を指定し、Web APIとは異なるポートで起動します。

rails s -p 3001

「http://127.0.0.1:3001/viewer/index」にアクセスすると、以下のようにWeb APIから取得したデータをFlexGrid上に表示できます。

Web APIから取得したデータを表示

データの登録(CREATE)、更新(UPDATE)、削除(DELETE)を行う

続いてデータの登録(CREATE)、更新(UPDATE)、削除(DELETE)の処理を追加していきます。まずは「app/views/wijmo/index.html.rb」を以下のように修正し、画面に[更新]ボタンを追加します。

<button id="update">更新</button>
<div id="flexGrid" style="height: 600px;"></div>

さらに「app/javascript/application.js」を以下のように修正し、[更新]ボタンが押下されたときにCollectionViewで追跡したグリッド上のデータの変更状況に応じて、登録、更新、削除のリクエストをそれぞれ実行します。

・・・(中略)
document.getElementById('update').addEventListener('click', function () {
    //POST(データの登録)
    for (var i = 0; i < cv.itemsAdded.length; i++) {
        wjCore.httpRequest(url, {
            method: 'POST',
            data: cv.itemsAdded[i]
        });
    }
    //PUT(データの更新)
    for (var i = 0; i < cv.itemsEdited.length; i++) {
        wjCore.httpRequest(url + cv.itemsEdited[i].id, {
            method: 'PUT',
            data: cv.itemsEdited[i]
        });
    }
    //DELETE(データの削除)
    for (var i = 0; i < cv.itemsRemoved.length; i++) {
        wijmo.httpRequest(url + cv.itemsRemoved[i].id, {
            method: 'DELETE'
        });
    }
});
・・・(中略)

データの読み込みの場合と同様に、あらかじめ前回作成したWeb APIを起動し、その後に以下のコマンドを実行してアプリケーションを実行し、 「http://127.0.0.1:3001/viewer/index」にアクセスします。

rails s -p 3001

グリッドの一番下の行にデータを入力し、[更新]ボタンを押下すると、データの登録ができます。

先程追加したデータの一部を編集し、[更新]ボタンを押下すると、データの更新ができます。

先程追加したデータの行を選択後、[Delete]キーで削除し、[更新]ボタンを押下すると、データの削除ができます。

さいごに

以上がRuby on Railsに「Wijmo」のデータグリッドコントロール「FlexGrid」を組み込んで、CRUD処理を実装する方法でした。WijmoにはFlexGrid以外にも高機能なUIコントロールが含まれていますので、気になった方はぜひ製品サイトもご覧ください。

製品サイトでは、Wijmoの機能を手軽に体験できるデモアプリケーションやトライアル版も公開しておりますので、こちらもご確認ください。

また、ご導入前の製品に関するご相談、ご導入後の各種サービスに関するご質問など、お気軽にお問合せください。

\  この記事をシェアする  /