Sinatra ルーティングとかテンプレートとか

Sinatra: README (Japanese)

ルーティング

複数のマッチングパターンに同じ処理を設定したい時

  • 配列にパターンを渡して回す
['/article/:num', '/article/entry/:num'].each do |path|
  get path do
    # 処理
  end
end
  • 手続きオブジェクトを渡す
article = lambda do
  # 処理
end
get '/article/:num',  &article
get '/article/entry/:num', &article

POSTも実装したい時はpost 'hoge', &fuga

ビュー/テンプレート

一部の処理が同一で、渡すテンプレートが一緒の場合
(似たような画面を量産する時など)

get '/hoge' do
  # 処理
  # /fugaと重複する処理
  erb :piyo   # views/piyo.erbを渡す
end

get '/fuga' do
  # 処理
  # /hogeと重複する処理
  erb :piyo   # /hogeと同じくviews/piyo.erbを渡す
end

こういう時には、

# どこかに定義
def piyopiyo
  # 重複する処理
  erb :piyo
end
get '/hoge' do
  # 処理
  piyopiyo
end

get '/fuga' do
  # 処理
  piyopiyo
end

↑でちゃんとテンプレートも渡される。


後ビューに値を渡す時、ローカル変数をテンプレートに渡すこともできる。

get '/hoge/:value' do
  value = params['value']
  erb :hoge, locals: { key: value }
end
# hoge.erb
<%= key %>

↑でvalueの値が表示される。
でも実際はインスタンス変数を定義してビューで使った方がいいらしい。
他の人がソースを読んだ時、ぱっと見でメソッドか変数かわからなくなるからとのこと。

<%= @hoge %>
<%= @fuga %>
<%= piyo %>
<%= piyopiyo %>
<%= key %>

たしかに。