Sinatraメモアプリ作り:JSONファイルでのデータ操作の仕方

Sinatraを使ったメモアプリを作るにあたり、作ったメモを保存したり取り出したりする必要があります。 今回はSQLなどのデータベースを使うのではなく、ファイルに読み書きをしてデータ操作をする方法を書いていきます。

準備

まず、アプリの実行ファイル(memo.rbなど)があるディレクトリに、publicというディレクトリを用意します。 次に、そのpublicディレクトリの中にdata.jsonというファイルを作成して入れておきます。 このdata.jsonファイルにメモの入力内容を読み書きしていきます。

保存するデータの構造を考える

Rubyで読み書きをするプログラムを書くまえに、保存するデータの構造を考えてみます。 今回は簡単なメモアプリなので、記録するデータはメモのタイトルと内容の2つになります。

そのため、{'title':'メモのタイトル', 'body':'メモの内容'}というハッシュ形式を取ります。 配列ではなくハッシュを使うのは、必要な情報を指定して取り出すのに適しているからです。

さらに、このままだと特定のメモの表示や削除などがしにくいので、メモにIDを持たせます。 よって、{'ID':{'title':'メモのタイトル', 'body':'メモの内容'}}の二次元ハッシュの形式にします。 複数のメモがある場合、{'ID1':{'title':'メモ1のタイトル', 'body':'メモ1の内容'}, 'ID2':{'title':'メモ2のタイトル', 'body':'メモ2の内容'},...}のようになります。こうすることで、メモのIDを指定してデータを取り出すことができるようになります。 IDには、オブジェクトID(object_idで取得)を使うといいと思います。

データの書き込みをする

{'ID':{'title':'メモのタイトル', 'body':'メモの内容'}}の形式にハッシュを加工できたら、それをファイルに書き込んでいきます。

@data = {'ID':{'title':'メモのタイトル', 'body':'メモの内容'}}の場合、

File.open('public/data.json', 'w') { |file| JSON.dump(@data, file) }

これで書き込みが出来ます。

データの読み込みをする

保存したデータを読み込む場合は、

File.open('public/data.json') { |file| @data = JSON.load(file) }

これで@dataに読み込んだデータが入ります。

データを追加する

データの追加の場合、まずはファイルを呼び出します。

File.open('public/data.json') { |file| @data = JSON.load(file) }

@data = {'ID1':{'title':'メモ1', 'body':'メモ1内容'}を取得しました。

このハッシュに、新しい要素を追加します。

@data[`ID2`] = {'title':'メモ2', 'body':'メモ2内容'}

結果は次のようになります。 @data = {'ID1':{'title':'メモ1', 'body':'メモ1内容'}, 'ID2':{'title':'メモ2', 'body':'メモ2内容'}}

最後に、要素を追加したハッシュでJSONファイルを書き換えます。

File.open('public/data.json', 'w') { |file| JSON.dump(@data, file) }

これで新しいメモのデータを追加できました。

データを変更する

まずJSONファイルを読み込み、@dataを取得します。(やり方は上にあるため省略) 次にハッシュのキーをIDで指定して、値の上書きをします。

@data[`ID1`] = {'title':'メモ1変更!', 'body':'メモ1内容変更!'}

結果は次のようになります。

{'ID1':{'title':'メモ1変更!', 'body':'メモ1内容変更!'}, 'ID2':{'title':'メモ2', 'body':'メモ2内容'}} JSONファイルに書き込んだら変更終了です。

データを削除する

JSONファイルを読み込みます。

データを削除する場合は、ハッシュのdeleteメソッドを使います。引数にキーとしてIDを指定することで、IDとそれに紐づいたハッシュを削除できます。 @data = {'ID1':{'title':'メモ1', 'body':'メモ1内容'}, 'ID2':{'title':'メモ2', 'body':'メモ2内容'}}の場合、

@data.delete('ID1')

を実行すると、結果は

@data = {'ID2':{'title':'メモ2', 'body':'メモ2内容'}}

となります。 最後にJSONファイルに上書きして削除完了です。

終わりに

以上でJSONファイルの操作の解説は終了です。 簡単なメモアプリならSinatraJSONファイルで実現できるので、ぜひ試してみてください。