SinatraでHello World!


Sinatraについて

RubyによるWebアプリケーションを手軽に作るためのフレームワーク。「CodingCast」ではWebの仕組みをより分かりやすく理解してもらいたいという目的で、Sinatraを使って小さなWebアプリケーションを作っていきます。

この動画の流れ

  • まずはSinatraの使うための準備をしていきます。

Sinatraの準備

  • gem install sinatraでGemのひとつであるSinatraのインストールをします。

Gemについて

他のひとがRubyで作ったパッケージです。サービスを作るときは全て自分で作っていくのはとても大変です。ですので他のひとが作ったパッケージをインストールして利用します。実はSinatraも他のひとが作ったパッケージです。

  • 次にsinatra-reloaderをインストールします。
    • プログラミングのコードを更新した時にサーバーを再起動しなくても更新を反映してくれるgemです。
  • requireを使ってインストールしたGemを利用できるようにします。
  • get '/' do ~ endでルートへのアクセスがきた時の動きを設定します。
    get '/' do
      "Hello world"
    end
  • コンソールでruby app.rbと打ち、プログラムを実行すると、エラーになってしまいます。
    • 動いているプログラムはCtrl+Cで終了できます
  • 今回はCloud9を使っているのでruby app.rb -p $PORT -o $IPと打つと実行できます。
    yourname:~/workspace (sinatra-hello-world) $ ruby app.rb -p $PORT -o $IP
    [2016-01-11 04:52:45] INFO  WEBrick 1.3.1
    [2016-01-11 04:52:45] INFO  ruby 2.2.1 (2015-02-26) [x86_64-linux]
    == Sinatra (v1.4.6) has taken the stage on 8080 for development with backup from WEBrick
    [2016-01-11 04:52:45] INFO  WEBrick::HTTPServer#start: pid=999 port=8080
  • https://workspace-username.c9users.io/ (usernameのところはユーザ名、workspaceのところはworkspace名)にアクセスします。
    • ※アクセスした際に長ーい表示が出る場合(後述)
  • Hello worldと表示されていれば成功です。
  • 「Hello world」を「こんにちは」に変えて表示も変更されるのを確認します。

検索してみよう

  • 「Sinara」という単語で検索エンジンを使って調べてみましょう。
  • 検索結果から公式のドキュメント(日本語版)を開いて読んでみましょう。
  • 今回使ったget '/' do ~ endの書き方がSinatraの決まりだということを確認してみましょう。

公式のドキュメントが出なかった方はこちら

今回のコードはこちらで確認できます。

前の章に戻る

次の章に進む

アクセスした際に長ーい表示が出る場合

下記のような長ーい文字列(例外)がコンソールに出てしまう場合があるかもしれません。これはsinatra-reloaderが新しいruby2.3に対応しきれていないために起きてしまう様子です。今はこれは読み飛ばして問題ありません。ただ、今後プログラムのコードを書き間違えたりした際にもここに表示されるので、混ざってしまうかもしれないので気をつけて下さいね。

Thread.exclusive is deprecated, use Mutex
/home/ubuntu/workspace/vendor/bundle/ruby/2.3.0/gems/sinatra-contrib-1.4.6/lib/sinatra/reloader.rb:222:in `block in registered'
/home/ubuntu/workspace/vendor/bundle/ruby/2.3.0/gems/sinatra-1.4.7/lib/sinatra/base.rb:1611:in `call'
/home/ubuntu/workspace/vendor/bundle/ruby/2.3.0/gems/sinatra-1.4.7/lib/sinatra/base.rb:1611:in `block in compile!'
/home/ubuntu/workspace/vendor/bundle/ruby/2.3.0/gems/sinatra-1.4.7/lib/sinatra/base.rb:1015:in `block in process_route'
/home/ubuntu/workspace/vendor/bundle/ruby/2.3.0/gems/sinatra-1.4.7/lib/sinatra/base.rb:1013:in `catch'
/home/ubuntu/workspace/vendor/bundle/ruby/2.3.0/gems/sinatra-1.4.7/lib/sinatra/base.rb:1013:in `process_route'
/home/ubuntu/workspace/vendor/bundle/ruby/2.3.0/gems/sinatra-1.4.7/lib/sinatra/base.rb:966:in `block in filter!'
/home/ubuntu/workspace/vendor/bundle/ruby/2.3.0/gems/sinatra-1.4.7/lib/sinatra/base.rb:966:in `each'
/home/ubuntu/workspace/vendor/bundle/ruby/2.3.0/gems/sinatra-1.4.7/lib/sinatra/base.rb:966:in `filter!'
/home/ubuntu/workspace/vendor/bundle/ruby/2.3.0/gems/sinatra-1.4.7/lib/sinatra/base.rb:1084:in `block in dispatch!'
/home/ubuntu/workspace/vendor/bundle/ruby/2.3.0/gems/sinatra-1.4.7/lib/sinatra/base.rb:1067:in `block in invoke'
/home/ubuntu/workspace/vendor/bundle/ruby/2.3.0/gems/sinatra-1.4.7/lib/sinatra/base.rb:1067:in `catch'
/home/ubuntu/workspace/vendor/bundle/ruby/2.3.0/gems/sinatra-1.4.7/lib/sinatra/base.rb:1067:in `invoke'
/home/ubuntu/workspace/vendor/bundle/ruby/2.3.0/gems/sinatra-1.4.7/lib/sinatra/base.rb:1082:in `dispatch!'
/home/ubuntu/workspace/vendor/bundle/ruby/2.3.0/gems/sinatra-1.4.7/lib/sinatra/base.rb:907:in `block in call!'
/home/ubuntu/workspace/vendor/bundle/ruby/2.3.0/gems/sinatra-1.4.7/lib/sinatra/base.rb:1067:in `block in invoke'
/home/ubuntu/workspace/vendor/bundle/ruby/2.3.0/gems/sinatra-1.4.7/lib/sinatra/base.rb:1067:in `catch'
/home/ubuntu/workspace/vendor/bundle/ruby/2.3.0/gems/sinatra-1.4.7/lib/sinatra/base.rb:1067:in `invoke'
/home/ubuntu/workspace/vendor/bundle/ruby/2.3.0/gems/sinatra-1.4.7/lib/sinatra/base.rb:907:in `call!'
/home/ubuntu/workspace/vendor/bundle/ruby/2.3.0/gems/sinatra-1.4.7/lib/sinatra/base.rb:895:in `call'
/home/ubuntu/workspace/vendor/bundle/ruby/2.3.0/gems/activerecord-4.2.6/lib/active_record/connection_adapters/abstract/connection_pool.rb:653:in `call'
/home/ubuntu/workspace/vendor/bundle/ruby/2.3.0/gems/rack-protection-1.5.3/lib/rack/protection/xss_header.rb:18:in `call'
/home/ubuntu/workspace/vendor/bundle/ruby/2.3.0/gems/rack-protection-1.5.3/lib/rack/protection/base.rb:49:in `call'
/home/ubuntu/workspace/vendor/bundle/ruby/2.3.0/gems/rack-protection-1.5.3/lib/rack/protection/base.rb:49:in `call'
/home/ubuntu/workspace/vendor/bundle/ruby/2.3.0/gems/rack-protection-1.5.3/lib/rack/protection/path_traversal.rb:16:in `call'
/home/ubuntu/workspace/vendor/bundle/ruby/2.3.0/gems/rack-protection-1.5.3/lib/rack/protection/json_csrf.rb:18:in `call'
/home/ubuntu/workspace/vendor/bundle/ruby/2.3.0/gems/rack-protection-1.5.3/lib/rack/protection/base.rb:49:in `call'
/home/ubuntu/workspace/vendor/bundle/ruby/2.3.0/gems/rack-protection-1.5.3/lib/rack/protection/base.rb:49:in `call'
/home/ubuntu/workspace/vendor/bundle/ruby/2.3.0/gems/rack-protection-1.5.3/lib/rack/protection/frame_options.rb:31:in `call'
/home/ubuntu/workspace/vendor/bundle/ruby/2.3.0/gems/rack-1.6.4/lib/rack/session/abstract/id.rb:225:in `context'
/home/ubuntu/workspace/vendor/bundle/ruby/2.3.0/gems/rack-1.6.4/lib/rack/session/abstract/id.rb:220:in `call'
/home/ubuntu/workspace/vendor/bundle/ruby/2.3.0/gems/rack-1.6.4/lib/rack/logger.rb:15:in `call'
/home/ubuntu/workspace/vendor/bundle/ruby/2.3.0/gems/rack-1.6.4/lib/rack/commonlogger.rb:33:in `call'
/home/ubuntu/workspace/vendor/bundle/ruby/2.3.0/gems/sinatra-1.4.7/lib/sinatra/base.rb:219:in `call'
/home/ubuntu/workspace/vendor/bundle/ruby/2.3.0/gems/sinatra-1.4.7/lib/sinatra/base.rb:212:in `call'
/home/ubuntu/workspace/vendor/bundle/ruby/2.3.0/gems/rack-1.6.4/lib/rack/head.rb:13:in `call'
/home/ubuntu/workspace/vendor/bundle/ruby/2.3.0/gems/rack-1.6.4/lib/rack/methodoverride.rb:22:in `call'
/home/ubuntu/workspace/vendor/bundle/ruby/2.3.0/gems/sinatra-1.4.7/lib/sinatra/show_exceptions.rb:25:in `call'
/home/ubuntu/workspace/vendor/bundle/ruby/2.3.0/gems/sinatra-1.4.7/lib/sinatra/base.rb:182:in `call'
/home/ubuntu/workspace/vendor/bundle/ruby/2.3.0/gems/sinatra-1.4.7/lib/sinatra/base.rb:2013:in `call'
/home/ubuntu/workspace/vendor/bundle/ruby/2.3.0/gems/sinatra-1.4.7/lib/sinatra/base.rb:1487:in `block in call'
/home/ubuntu/workspace/vendor/bundle/ruby/2.3.0/gems/sinatra-1.4.7/lib/sinatra/base.rb:1787:in `synchronize'
/home/ubuntu/workspace/vendor/bundle/ruby/2.3.0/gems/sinatra-1.4.7/lib/sinatra/base.rb:1487:in `call'
/home/ubuntu/workspace/vendor/bundle/ruby/2.3.0/gems/rack-1.6.4/lib/rack/handler/webrick.rb:88:in `service'
/usr/local/rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/webrick/httpserver.rb:140:in `service'
/usr/local/rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/webrick/httpserver.rb:96:in `run'
/usr/local/rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/webrick/server.rb:296:in `block in start_thread'