Sinatraでアプリ開発やってみよう

Railsチュートリアルを済ませて何となくは分かったものの、Railsはまだアイテムレベルが高い気がする。

ので!

とりあえずフレームワークというものを使ってみたいので、Sinatra というRailsとは対照的に極シンプルであるフレームワークがあるらしいから触ってみることに。

環境

Ubuntu 14
ruby 2.1.5

考えてみると、MacBookには叶わないと思うけれど、レンタルサーバーって管理が不要でわりとどこでも開発できる環境なんじゃないか?ということに気付いたが、thinを入れようとしたらeventmashineのインストールでこけたので中止。
追いかけるのは今やるべきじゃないと思うので、ローカルのUbuntuでやる事にした。

おほほ(;^ω^)

インストール

技術評論社のRuby徹底攻略を参考に進めていきます。

$ mkdir sinatra_projects
$ cd sinatra_projects

bundle init で Gemfileができるので中身を記述。

$ bundle init
$ cat Gemfile
source "https://rubygems.org"
gem 'sinatra'
gem 'thin'

$ bundle update
$ bundle install

Railsチュートリアルをやったので何となく意味は大丈夫だが、Rubyのことはまだほとんど知らない。

$ vi app.rb
require 'sinatra'

get '/' do
        'Hello, world!'
end

起動してみます。オプションは-o 0.0.0.0でもOK。
OKですがどちらかは付ける必要があります。

$ ruby app.rb -e protection
== Sinatra/1.4.5 has taken the stage on 4567 for protection with backup from Thin
Thin web server (v1.6.3 codename Protein Powder)
Maximum connections set to 1024
Listening on 0.0.0.0:4567, CTRL+C to stop

これでアクセスすればHello world!が出る。
出たら準備は完了かね。

何をやるか

端的にシンプルなことならSinatra。DBとリンクしていろいろな処理(ユーザー認証・管理とか?)をするとか複雑な事をさせるアプリだとRailsがという書かれ方をしている。
楽という表現になるのはそういう事なのだろうなあ。
今回はAPIを処理する簡単なページを作ろうと思っていたのでSinatraというチョイスは方向性は間違ってはいないようだ。

ちなみにSinatraはUIだけ、CGIの代わりだけといったような用途にも向いているらしい。

irbで実験

ライブラリの読み込み

> require 'open-uri'
> require 'json'

DoorKeeperさんのイベントを取得してみます

> url = 'http://api.doorkeeper.jp/events/?ruby'
* json = open(url).read
=> "[{\"event\":{\"title\":\"CS-Cafe@Tsukuba #3\",\"id\":17897,\"starts_at\":\"2014-12-10T09:30:00.000Z\",\"ends_at\":\"2014-12-10T11:30:00.000Z\",\"venue_name\":\"\\u7b51\\u6ce2\\u5927\\u5b66\\u7dcf\\u5408\\u7814\\u7a76\\u68dfB\\u68df1001

JSONライブラリでRubyのオブジェクトに変換します。

> repos = JSON.parse(json)
=> [{"event"=>{"title"=>"CS-Cafe@Tsukuba #3", "id"=>17897, "starts_at"=>"2014-12-10T09:30:00.000Z", "ends_at"=>"2014-12-10T11:30:00.000Z", "venue_name"=>"筑波大学総合研究棟B棟1001号室", "address"=>"茨城県つくば市天王台", "lat"=>"36.111155", "long"=>"140.09998730000007", "ticket_limit"=>10, "published_at"=>"2014-11-23T13:42:04.283Z", "updated_at"=>"2014-11-23T13:42:04.287Z",

ppライブラリで表示を整えたり。

* require 'pp'
=> true
> pp repos; nil
[{"event"=>
   {"title"=>"CS-Cafe@Tsukuba #3",
    "id"=>17897,
    "starts_at"=>"2014-12-10T09:30:00.000Z",
    "ends_at"=>"2014-12-10T11:30:00.000Z",
    "venue_name"=>"筑波大学総合研究棟B棟1001号室",
    "address"=>"茨城県つくば市天王台",
    "lat"=>"36.111155",

他にも色々ありますが、ただリクエストするだけだったら、だいたいこんな感じです。

勉強会の情報を取得するページを作ってみる

練習ではdoorkeeperさんでしたが、こっちはatndさんでいきます。

あとでgithubにアップするので、たんたんと流れだけ書いてみます。

・ルートとビューから呼べるヘルパーメソッドを作成。
・ルート定義とやら
Railsのコントローラにあたる模様。Railsチュートリアルでは色々なページがあったので複数ならべていましたが、今回は1ページなのでget ‘/’ do のみで良い模様。
ルート定義の中にhtmlを文字列として渡す処理を書き込み、erbメソッドに渡す方法がやりやすいようです。

erbファイルを別に置く場合は、viewsディレクトリ以下に設置して、ファイル名をシンボルとして渡せばよいとのこと。

get '/' do
 erb :hoge
end

こんな感じ。

Railsにあったレイアウト機能も利用可能で、これもviews以下に設置。
基本的なところはほぼ共通なようだ。

views/layout.erb

bodyタグ内で
 <body>
 <%= yield %>
 </body>

みたいな感じ。

スタイルシートはpublic以下に設置すればOK。
では参考書籍にならって、app.rbに打ち込んでいきます。

PHPだとわりとすぐに出来たのにRubyだとうまく書けない・・・
うー うー うー

 

Bootstrapを使ってみよう

公式からDLしてきてSinatraの作業ディレクトリに展開。

publicにリネームしました。

public
├── css
│   ├── bootstrap-theme.css
│   ├── bootstrap-theme.css.map
│   ├── bootstrap-theme.min.css
│   ├── bootstrap.css
│   ├── bootstrap.css.map
│   └── bootstrap.min.css
├── fonts
│   ├── glyphicons-halflings-regular.eot
│   ├── glyphicons-halflings-regular.svg
│   ├── glyphicons-halflings-regular.ttf
│   └── glyphicons-halflings-regular.woff
└── js
    ├── bootstrap.js
    ├── bootstrap.min.js
    └── npm.js

そしてそして

やっと出来上がりました!
app.rb 1枚でもいける全然短いコードですが、erbを2枚つかって読み込む感じにしてます。
慣れるためのものなので。

takekentw/sinatra_projects · GitHub:

saku

かわいいは正義!と言うだけあって、見栄えがいいとそこそこ見れる。

最初はこんなのでいいよね~。
viewsとかcontrollerとかに慣れて、もうちょっと大きいものが必要になったらRailsに戻ろう。
イベントサイトを網羅するとなるとDBは必須だろうし、そうなるとRailsがらしい。

参考書籍

Ruby 徹底攻略 技術評論社

参考サイト

rails から外れた僕らは sinatra で i did it my way (2) – momota.txt:

セミナー・勉強会・イベント管理ツール | Doorkeeper:

イベント開催支援ツール アテンド : ATND:

 

 

Similar Posts:


Leave a Reply

Your email address will not be published. Required fields are marked *