2016.5.4
2017.5.25

Sinatraの利用

RubyでWebサイトを構築しようとすると、規模が大きいものは「Rails」、規模が小さく軽量なものは「Sinatra」と、構築しようとするWebサイトの特性に合わせて、このどちらかのフレームワークを利用することが一般的のようです。

今回は、個人サイトで利用するため「Sinatra」を使ってみました。

目次

  • インストール
  • 使い方
  • パラメータの取得方法
  • ERBテンプレートの利用
  • JSONデータの出力
  • JSONデータの出力(Active Record版)
  • 参考リンク

インストール

まずはインストール


gem install sinatra
gem install sinatra-contrib

2行目の「sinatra-contrib」をインストールする理由は、コード変更時にWebサーバを再起動するのが面倒なので、リロード機能を実装するため。

使い方

使い方は下記のとおり。


require 'sinatra'
require 'sinatra/reloader'

class MainApp < Sinatra::Base
    register Sinatra::Reloader

    get '/test1/' do
        'Hello World'
    end
end

MainApp.run!

2行目と5行目がリロード機能のコード。ただし、「get ~ do」内のコード変更時はWebサーバの再起動が不要ですが、新しく別の「get ~ do」を追加した場合は再起動が必要でした。

12行目は作成したMainAppクラスを実行(run)しています。Rackupを利用して「config.ru」からMainAppクラスを実行できる環境を整えていれば、12行目は不要。

上記URLの /test1/ にアクセスすると「Hello World」という文字がブラウザに表示されます。

パラメータの取得方法

パラメータの取得方法は以下のとおり。


get '/test2/:p1/:p2/' do
    'パラメータ[p1]:' + params[:p1] + '<br/>GETパラメータ[p2]:' + params[:p2]
end

上記はGETパラメータの取得方法だが、POSTされたパラメータについても同様な方法で取得可能です。

取得の方法は他にもありますが、個人的にはこちらの方が分かりやすいです。

ERBテンプレートの利用

ERBテンプレートを利用してページを生成する場合の方法。

まず「views」ディレクトリを作成して、その配下に「index.erb」ファイルを作成します。

「index.erb」の内容は以下のとおり。


<html>
    <head>
        <title><%= @title %></title>
    </head>
    <body>
        <h1><%= @title %></h1>
        <p><%= @content %></p>
    </body>
</html>

続いてSinatraのリクエスト処理。


get '/test3/' do
    @title = "テストページ"
    @content = "テストコンテンツ"
    erb :index
end

2行目、3行目で「index.erb」内に埋め込んだ変数の設定。

4行目で「views」ディレクトリ配下の「index.erb」を指定しています。

JSONデータの出力

レスポンスでページではなくJSONデータを返す方法。


get '/test4/' do
    list = [{id:1, name:"A"}, {id:2, name:"B"}, {id:3, name:"C"}]
    content_type :json, :charset => 'utf-8'
    list.to_json()
end

JSONデータの出力(Active Record版)

Active Recordを利用して取得したデータをJSONデータとして返す方法。


get '/test5/' do
    list = Category.get_category_list()
    content_type :json, :charset => 'utf-8'
    list.to_json(:root => false)
end

上記は「categories」テーブルから複数のレコードを取得して返す処理。

4行目「:root => false」を「:root => true」に変更するとノード名(category)が出力されてしまうので、通常は「false」または設定なし(デフォルトでfalse?)で処理します。

参考リンク

Ruby】関連記事