2010年12月27日月曜日

[Scala]LiftのLiftRules.rewriteでURLrewriting

開発に専念しててなかなか記事が書けない・・・軽めに書けるネタをひとつ。
Liftのrewriteを使ってURLを整えるコード。
今回やりたいのはこういう変換
  • IDだけが来たらindexにIDを渡す
    /a/[id]
    -> /aaa/index?id=[id]
  • IDと機能が来たら機能にIDを渡す
    /a/[id]/[function]
    -> /aaa/function?id=[id]
  • IDと機能とコンテンツ指定が来たら機能にIDとコンテンツ指定を渡す
    /a/[id]/[function]/[contents]
    -> /aaa/function?id=[id]&contents=[contents]
ポイントはURL上はIDを手前に持ってきて
ID:Aの機能XのコンテンツZ、という表記にするところ。

src/main/scala/bootstrap/liftweb/Boot.scala
LiftRules.rewrite.prepend(NamedPF("WorldRewrite") {
case RewriteRequest(
ParsePath( "a" :: id :: Nil, _, true , false ), _, _) =>
RewriteResponse(
List ( "aaa" , "index" ) , Map( "id" -> id)
)
case RewriteRequest(
ParsePath( "a" :: id :: function :: Nil, _, true , false ), _, _) =>
RewriteResponse(
List ( "aaa", function) , Map( "id" -> id)
)
case RewriteRequest(
ParsePath( "a" :: id :: function :: contents :: Nil, _, true , false ), _, _) =>
RewriteResponse(
List ( "aaa", function) , Map( "id" -> id, "contents" -> contents)
)
})
これでいけてるようです。バージョンは2.1。
  1. ParsePathで変換前のパスを指定。ディレクトリの区切りはリスト的な表記でどうにかしてくれます。
    後ろの引数はtrueになっているところがabsolute(絶対パス)、falseになっているとこがendslash。endslashの動きがいまいち読めないのでfalseにしてます。
    ここで指定しているidとかfunctionは続くRewriteResponseで利用します。
  2. ReqriteResponseで変換後のパスを設定します。
    まず第一引数には呼び出すビューの位置を指定します。ここでParthPathで設定した名前を利用できるのでList( "aaa", function )とすれば/aaa/functionになります。
    第二引数のMapではGETパラメータを設定できます。
  3. クエリストリングは特に何も指定しなくても勝手に引き継いでくれるみたいです。

0 件のコメント:

コメントを投稿