sinatraで動的なウェブサイトを作る

2015年8月12日 0 投稿者: khws4v1

html直置きだといろいろと面倒なことに気がついたので、sinatraでどうにかすることにした。

sinatraとは

Sinatraは最小の労力でRubyによるWebアプリケーションを手早く作るためのDSLです。

Sinatra: README (Japanese)

インストール

Hello world

  1. まず、rubyのコードを書く。
    ちなみにsinatra/reloaderはコードなどを更新したときにいちいちサーバーを再起動しなくてもいいようにrequireする。

  1. 実行する。

  1. ブラウザでlocalhost:4567を開く

やり方

習うより慣れろだ。
使用例を見て見よう。

ディレクトリ構造

  • /
    • app.rb
    • data.yaml
    • views
      • index.haml
      • goods.haml
      • layout.haml

中身

解説

app.rb

各商品の詳細ページは/商品名にアクセスすると出てくるようになっている。
このようなことをやるには名前付きパラメータを使うとできる。

詳しくはこちら

だが、これだと存在しない商品にもアクセスできてしまうのでチェックが必要だ。
しかし、面倒くさいのでこのようなコードになっている。
これだと、存在する商品のページにしかルーティングされない。
もし、存在しないページ・・・つまりどこにもルーティングされていないアクセスがあった時は、404になる。
404の時の挙動はnot_found do以下のコードにあるようにコントロールできる。

詳細ページはそれぞれのページを用意せず、goods.hamlで動的に出すようにしている。
この時、出すべき商品を決めるためにパラメータを渡してあげたいので@から始まるインスタンス変数に格納する。
こうすれば各viewの中でもその変数を使うことができる。

data.yaml

商品のデータを格納したファイル。
簡単にかけるYAMLを使った。

views/index.haml

トップページ。

data.yamlからデータを取り出して表示する。
data.yamlのパスはapp.rbと同じ階層なのでsettings.rootでapp.rbが格納されているディレクトリを取得している。

hamlでは-から始まる部分はrubyのコードとして認識される。
eachメソッドみたいな繰り返しをする場合、インデント下げた場所に繰り返したい部分を書く。
rubyの変数を途中に入れたい場合は#{value}と書く

views/goods.haml

商品の詳細ページ。

インスタンス変数で受け取った商品を出力する。

views/layout

各viewの共通部品。
= yieldの部分に各viewが来る。

こうすることで共通する部分を繰り返し書かなくてもいいので楽。


hamlの書き方は、Hamlが5分で分るチートシート [Rails初心者チュートリアル] – 酒と泪とRubyとRailsとを見れば困らないでしょう。
htmlから変換するHTML2Haml | Convert HTML Snippets to Hamlを使うのもおすすめ。
分からなかったらとりあえずhtml書いて変換してみよう。