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:

 

 

Related Posts


投稿者: Takeken

インターネット利用者のITリテラシーを向上したいという設定の2次元キャラです。 サーバー弄りからプログラミングまで手を付けた自称エッセイストなたけけんの物語。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です