sinatraで動的なウェブサイトを作る
html直置きだといろいろと面倒なことに気がついたので、sinatraでどうにかすることにした。
sinatraとは
Sinatraは最小の労力でRubyによるWebアプリケーションを手早く作るためのDSLです。
インストール
1 2 |
sudo gem install sinatra sudo gem install sinatra-contrib |
Hello world
- まず、rubyのコードを書く。
ちなみにsinatra/reloader
はコードなどを更新したときにいちいちサーバーを再起動しなくてもいいようにrequireする。
1 2 3 4 5 6 |
require 'sinatra' require 'sinatra/reloader' get '/' do 'Hello world' end |
- 実行する。
1 |
ruby app.rb |
- ブラウザで
localhost:4567
を開く
やり方
習うより慣れろだ。
使用例を見て見よう。
ディレクトリ構造
- /
- app.rb
- data.yaml
- views
- index.haml
- goods.haml
- layout.haml
中身
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
require 'sinatra' require 'sinatra/reloader' require 'haml' require 'yaml' get '/' do haml :index end YAML.load_file("#{settings.root}/data.yaml").keys.each do |key| get "/#{key}" do @key = key haml :goods end end not_found do 'NOT FOUND' end |
1 2 3 4 5 6 7 8 9 10 11 12 |
unko: name: うんこ price: 931 description: くさい kusa: name: 草 price: 93 description: wwwwww apple: name: りんご price: 114514 description: 林檎は即刻中止せよ! |
1 2 3 4 5 |
%h1 今日の特売品 - YAML.load_file("#{settings.root}/data.yaml").each do |key, goods| %a{:href => "/#{key}"} %h2 #{goods['name']} %p #{goods['price']}円 |
1 2 3 4 |
- goods = YAML.load_file("#{settings.root}/data.yaml")[@key] %h1 #{goods['name']} %h2 お値段: #{goods['price']}円 %p #{goods['description']} |
1 2 3 4 5 |
!!! 5 %head %title ぼったくり %body = yield |
解説
app.rb
各商品の詳細ページは/商品名
にアクセスすると出てくるようになっている。
このようなことをやるには名前付きパラメータを使うとできる。
1 |
get '/:goods_key' do |goods_key| |
詳しくはこちら。
だが、これだと存在しない商品にもアクセスできてしまうのでチェックが必要だ。
しかし、面倒くさいのでこのようなコードになっている。
これだと、存在する商品のページにしかルーティングされない。
もし、存在しないページ・・・つまりどこにもルーティングされていないアクセスがあった時は、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書いて変換してみよう。