SinatraとRoute
今回はControllerに当たるapp.rbを中心とした、URLのルーティングについて。
この辺でも少し触れていましたね。
URL構成
現在の構成はこんな感じです。
- localhost:9292/ --- ブログ記事の一覧を表示
- localhost:9292/tag/XXX --- タグ検索の結果を表示。XXXにはタグIDが入る
- localhost:9292/article/XXX --- ブログ記事の詳細ページ。XXXには記事IDが入る
リンクの付与
Railsだと少し違っていたような気もしますが、views/blog.slimなどで以下のように設定しています。
views/blog.slim
- @aryPosts.each do |post| - postid = post.post_id article - posturl = "/article/" + postid.to_s a href=posturl =post.post_title
- 頭に[-]を付与するとRubyの処理を記述でき、[=]を付与すると処理で得た値をHTML上で使うことができます。[a href=]の辺りなどは[=]が多くて変な感じもしますねw
- [a href=]の部分で遷移先のURLをセットしますが、今回のように固定文字列と動的に出力した文字列を組み合わせたい場合に「href=」の部分で直接連結できなかったため、別途[posturl]としてURL文字列を作成しています。
ルーティング
URL構成にある3種類のURLで、表示内容を切り分ける必要があります。
また、タグ検索結果、ブログ記事の詳細ページの場合は、それぞれのIDを取得する必要があります。
app.rb
get '/' do # localhost:9292/にアクセスした時実行 end get '/article/:name' do # localhost:9292/tag/XXXにアクセスした時実行 puts params[:name] end get '/tag/:name' do # localhost:9292/article/XXXにアクセスした時実行 puts params[:name] end
- [/]や[/article/]の部分はそのままですね
- [:name]とすることで、XXXの部分に含まれるデータを、[params[:name]]で取得できるようになります。
正規表現で切り分け
例えば[/page1.html]、[/page2.html]のように同じ階層に複数のページがある場合、正規表現を使うと便利そうです。 * SinatraとHamlとScssとCoffeeScriptでモダンなWeb制作環境を構築する #2 - Developers.IO
クエリ文字列
ブログ記事一覧やタグ検索ページでは、DBのデータすべてを表示するのではなく、決まった件数ごとにページ分けしてページャーで行き来するようにしたいところ。
ここで起こる問題は、考えられるURLのパターンが2種類あることです。 * localhost:9292/page/1 * localhost:9292/tag/1/page/1
そこで、「/page/XXX」の形を取るのではなく、[?page=XXX]という形でURLを指定します。
views/blog.slim
article - intPagerNum = 1 - @intPagerCount.times do - pageurl = "?page=" + intPagerNum.to_s a href=pageurl =intPagerNum - intPagerNum += 1
- @intPagerCountには、データ数からページャー数を算出してセットしていて、1、2、3…と順番に表示されるようにしています。
- [localhost:9292/?page=1]というURLでページャーを押下して2ページ目を開いた場合も、[localhost:9292/?page=1?page=2]とはならず[localhost:9292/?page=2]として遷移してくれます。便利ですね。
クエリ文字列からのデータ取得
クエリ文字列で設定したデータも、[:name]と同じようにControllerで取得できます。
app.rb
get '/' do # localhost:9292/にアクセスした時実行 puts params[:page] end
- 「name」の部分が自分で設定した「page」に置き換わります。
- ルーティング自体は前述で設定したものがそのまま使えるため、[/]と[/tag/:name]の部分で[params[:page]]を取得すればOKです。
- クエリ文字列がURLに含まれない場合はnilが返るため、文字列型に変換したい場合などは、先にnilかどうかをチェックする必要があります。