Lift CRUDify

■LiftでCRUDするには

"lift crud"で検索すると、ご存じyuroyoroさんの以下のページが一番先頭に来る。

  • scalaのWebフレームワーク liftで遊ぶ(8) – いよいよModelでCRUDするぜ?

このエントリは2008年のものなので、情報が若干古くなってる(※)。Liftは良くも悪くも変更が多いので。

そのシリーズの(9)には以下のような事が書かれているんだけど、今のLiftにはCRUDifyなるtraitが存在する。

liftには、Railsscaffoldみたいにコマンド一発でドゥーン!とCRUDができるなんてことはありません。

※逆に言うと、かなり前から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を使えるようにしたい
  • 自分が追加したオブジェクトだけ編集・削除できるようにさせたい

その場合のやり方。

  1. Boot.scalaのSiteMapに登録する所で制限をかける。
  2. 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でのやりとりを参考にした。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です