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ファイルの操作の解説は終了です。 簡単なメモアプリならSinatraとJSONファイルで実現できるので、ぜひ試してみてください。