以前公開した記事では、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が表示できます。
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上に表示できます。
データの登録(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の機能を手軽に体験できるデモアプリケーションやトライアル版も公開しておりますので、こちらもご確認ください。
また、ご導入前の製品に関するご相談、ご導入後の各種サービスに関するご質問など、お気軽にお問合せください。