Lift CRUDify
■LiftでCRUDするには
"lift crud"で検索すると、ご存じyuroyoroさんの以下のページが一番先頭に来る。
- scalaのWebフレームワーク liftで遊ぶ(8) – いよいよModelでCRUDするぜ? →
このエントリは2008年のものなので、情報が若干古くなってる(※)。Liftは良くも悪くも変更が多いので。
そのシリーズの(9)には以下のような事が書かれているんだけど、今のLiftにはCRUDifyなるtraitが存在する。
※逆に言うと、かなり前からScala関連の記事を精力的に書いていてスゴいと思います。
■CRUDify
LiftでCRUDの機能を使うには、CRUDifyというtraitをくっつけるだけ。lift-mapperの使い方は他のページなどを見てもらうとして、以下の感じでCRUDifyを使う。
object Foo extends Foo with LongKeyedMetaMapper[Foo] with CRUDify[Long, Foo] {
これだけでほぼ完了。後はSiteMapにMenuを追加するだけ。今回のケースではFoo.menusがList[Menu]なので、それを使えばOK。
ちなみにCRUDifyのドキュメントはあまりないようなので、ソースを直接見た方が早そう。
■アクセス制限
以下のようなアクセス制限をかけたい場合がある。
- ログインしているユーザーだけCRUDを使えるようにしたい
- 自分が追加したオブジェクトだけ編集・削除できるようにさせたい
その場合のやり方。
- Boot.scalaのSiteMapに登録する所で制限をかける。
- CRUDifyのxxxMenuLocParamsをオーバーライドする。
1.のやり方はExploring Lift (The Lift Book)の7.3に載ってる。
val loggedIn = If(() => User.loggedIn_?, () => RedirectResponse("/login")) val profileMenu = Menu(Loc("Profile", "profile" :: Nil, profileText, loggedIn))
2.のやり方を少し説明する。1.と基本は一緒で、表示するかどうかを判別するIfというクラスを使って、その条件を満たす時だけ機能を有効にするという感じ。
object Foo extends Foo with LongKeyedMetaMapper[Foo] with CRUDify[Long, Foo] { // super userかどうかを判別する val superUser_? = If(() => User.currentUser match { case Full(user) => user.superUser; case _ => false} , // 第二引数は失敗した時の動作 () => RedirectResponse("/user_mgt/login")); // super userだけしかCURDは使えなくする(viewは除く) override def showAllMenuLocParams: List[Loc.AnyLocParam] = List(superUser_?); // override def viewMenuLocParams: List[Loc.AnyLocParam] = List(superUser_?) override def createMenuLocParams: List[Loc.AnyLocParam] = List(superUser_?); override def editMenuLocParams: List[Loc.AnyLocParam] = List(superUser_?); // deleteは機能まるごと廃止 override def deleteMenuLoc: Box[Menu] = Empty; }
MLでのやりとりを参考にした。