Webとデザインのあれこれ

プログラミングとUIデザインの学習記録です。

Sinatraについて

Sinatraで簡単なアプリを作る

Sinatraとは

Sinatraは、Rubyで簡単にWebアプリケーションが作成できるDSLです。

RubyといえばRuby on Railsですが、多機能のため初心者には厳しいということもあり、 Fjord Boot CampではまずSinatraで簡単なアプリを作成するという課題が設けられています。

簡単に作れる?

まず、先に述べると簡単には作れないです(人によりますが)。簡単というよりも、機能がRailsに比べてシンプルで軽量ということみたいです。 また厳密にMVCフレームワークに沿っているわけではないので、初心者にも親しみやすいという特徴があります。

Sinatraの使い方

具体的な手順に関しては、以下の公式ドキュメント(日本語)にほぼ全て書かれてあります。

sinatrarb.com

ただ、いきなりこちらを参照するのはきついのでこちらの記事がおすすめです。

また、Paizaラーニングやドットインストールにも講座があるので確認してみてください。

前提知識について

個人的に難しく感じた点を以下に整理します。

  1. HTTPメソッドとHTMLのフォームの仕組みを理解しないとURLの設定ができないこと
  2. 本課題に関してはDB使用禁止だったため、CGI・標準入出力・JSONなどの理解が必須であったこと

過去記事にも記載しましたが、HTTPの主なメソッドは6つ存在します。ただ、HTMLのフォームで指定できるメソッドがGETとPOSTの2種類しか存在しないため、 現実的に一番利用されるのが以下のGETメソッドとPOSTメソッドの2つだけになります。

メソッド

名称 説明
GET 最も一般的に使用されるメソッドです。ブラウザはサーバに対してページ(リソース)の取得を要求します。
POST CGI でよく使用されるメソッドです。method="POST" を指定したフォームに入力したデータをサーバに転送する際に使用されます。

フォームを利用しながらリソースを更新(PUT)したり、削除(DELETE)するためにはどうしたら良いのでしょうか?

_methodパラメータの利用

フォームの隠しパラメータに_methodというパラメータを用意し、そこに本来送りたかったメソッドを指定してあげる方法です。 Ruby on Railsはこの_methodパラメータを採用しています。

X-HTTP-Method-Overrideという方法もありますがXMLをPOSTする場合などに限定されるため割愛します。

<form method="POST" action="/list/1">
  <input type="hidden" id="_method" name="_method" value="PUT" />
  <textarea id="body" >...</textarea>
</form>

上記はPUTメソッドを実装するために、隠しパラメータを利用している例です。Webサーバーは_methodパラメータを見て、PUTメソッドとしてリクエストを扱っています。

ちなみにRails4以降では、リソースの更新(updateアクション)にPATCHを利用しています。

注: PUTも使えますがリソースの一部更新を意味するPATCHの方がよりふさわしいという理由です。

上記を踏まえた上でのフォームによる値の更新やボタンを利用した削除の実装が個人的に難しく感じました。

2.の条件(DB禁止)については、かなり苦戦しました。DBを利用できれば削除などの処理はそれほど難しくないのですが、データをファイルに保存して読み込む処理をRubyで記述する必要があり、理解に時間がかかりました。

最終的に、ファイルにデータを保存する処理をJSONというデータフォーマットを利用して行うことで対応できました。CGIに対する理解を深めるためにこのような条件が課されていたようです。

@json_data = File.open('memo.json') do |file|
    JSON.parse(file.read)
  end

RubyJSONを扱う際には下記の記事が参考になりました。 uxmilk.jp

短いですが、以上となります。Sinatraを利用することでHTTPメソッドやルーティングに対しての知識が深まったので、 今後のRailsの学習に繋げたいと思います。

最後に

HTTPメソッドやHTMLの形式、JSONを理解する上で以下の書籍がとても参考になりました。Railsについて学ぶ方にも参考になるかと思います。

Webを支える技術 -HTTP、URI、HTML、そしてREST (WEB+DB PRESS plus)

RESTの概念などについてまだまだ理解が不十分ですが、繰り返し再読することで理解を深めたいと思います。