脳汁portal

アメリカ在住(だった)新米エンジニアがその日学んだIT知識を書き綴るブログ

[Ruby] Sinatra超入門

Sinatraで、入力した値を表示させるだけの超簡単なアプリをつくる方法を手順化して説明します。

1.環境作成
yum install openssl-devel httpd
gem install sinatra
gem install thin
  • まずはApacheの設定やsinatraのインストールをします。
  • sinatraはそれだけで起動するとweblickを使うのですが、thinをインストールしてあるとそちらを優先して使うので、今回はthinもインストールしておきます。
2.ファイルの作成

ファイル名は適当に「test.rb」で作成します。

require 'sinatra'

get '/top' do
  "Hello World"
end
  • まずsinatraをrequireします
  • その後にルートにアクセスが来た場合の処理を書きます。
3.起動して確認
ruby test.rb

portaltan.hatenablog.com

4.test.rbに書いていたview部分を他ファイルに切り出します。
require 'sinatra'

get '/top' do
  erb :index
end
  • 形式とファイル名を指定

実際のviewファイルを作成しましょう。

  • まずはviewsディレクトリを作成します
  • その下にviewファイルを作成します(今回はindex.erb)
<html>
<head>
</head>
<body>
  "Hello World"
</body>
</html>
5.パラメーターの利用
require 'sinatra'

get '/top/?:name?' do |n|
  @name = n
  erb :index
end
  • パラメータはシンボルで指定します。
  • ?をつけることで、任意入力になり、パラメータがなくてもよくなります。(つけないでパラメータなしだとエラーになります)
  • パラメータはブロック引数で受け取れます
  • 受け取った値をViewで使いたいときはインスタンス変数にいれます
<html>
<head>
</head>
<body>
  Hello <%= @name %>
</body>
</html>
6.before/after条件の設定
before do
  @title = "test application"
end

after '/top/*'do |n|
  logger.info("#{n} name was sent")
end
  • アクセスが来たときに、beforeで処理前・afterで処理後の設定を指定できます
  • また、これもgetと同じように特定のURLへのアクセスの時のみに設定をすることが可能です
  • パラメータをワイルドカード(今回は*)にしても、ブロック引数としてとることができます
  • loggerメソッドでログに出力することができます

ログ出力

I, [2015-07-21T03:52:37.112219 #4101]  INFO -- : nouziru name was sent
<html>
<head>
  <title><%= @title %></title>
</head>
<body>
  Hello <%= @name %>
</body>
</html>
7.Viewのリファクタリング(layout.rb)

sinatraはviewsディレクトリにlayout.rbというファイルがあるとそれを最初に読み込みます。
なので、viewの共通部分はlayout.rbにまとめてしまって、各ファイルには固有部分だけ記載すると使いまわしがききます。

viwes/layout.rb

<html>
<head>
  <title><%= @title %></title>
</head>
<body>
  <%= yield %>
</body>
</html>
  • 各ファイルの固有部分を挿入する位置は、yieldで指定します。

views/index.erb

Hello <%= @name %>
8.postで値を送って表示します

views/index.erb
まずは送り側を作成します

Hello <%= @name %>

<h2>Post comment</h2>
<form method="post" action="/new">
    <input type="text" name="newName">
    <input type="submit" value="post!!">
</form>

index.rb
次に受け取り側の処理を書きます

post '/new' do
  redirect "/top/#{params[:newName]}"
end
  • postの場合は今までgetにしていた部分をpostにします
  • パラメータはparams[:パラメータ名]で受け取ります
9.入力値のサニタイジングをします

今のままではスクリプトも何でも入力できてしまうガバガバ設計なので、入力値をチェックするメソッドをhelperメソッドとして記述します。

helpers do
  include Rack::Utils
  alias_method :h, :escape_html
end

これでスクリプトが入力されてもescapeできます。