Thanks for your reply, But I would like them combine with Menu tightly, so I could setup them only in my Model, just like CRUDify trait.
In the end, I created a Loc subclass myself, and use it to handle all the rewrite stuff, it seems works pretty well and make thing much simpler (at least for me), so I post the code here. Feel free to use it if anybody need this. /** * A RESTful-like URL handling Loc * * If you have the following templates: * * * webapps/item/edit.html * * webapps/item/view.html * * You want the following URL map to corresponding template with * last path component as a S parameter. * * http://localhost/item/edit/1 to http://localhost/item/edit * http://localhost/item/view/1 to http://localhost/item/view * * You could create a Menu with this Loc class in your Model object. * * <code> * object Item extends Item with LongKeyedMetaMapper[Item] * { * // Other methods here... * * def menu () { * * // What methods do we have? * val methods = List ("view", "edit") * * val parameterName = "itemID" * val itemLoc = new RESTfulLoc("Item", List("item"), "Item", * methods, parameterName) * * Menu (itemLoc) * } * } * </code> * * Now add the menu to SiteMap in Boot.boot * * <code> * class Boot { * def boot () { * * val entries = Item.menu :: Nil * * LiftRules.setSiteMap(SiteMap(entries:_*)) * } * } * </code> * * * Finally, You could access the parameter in your snippet with * S.param("itemID") * */ class RESTfulLoc (val name: String, val path: List[String], val text: LinkText[Unit], val methods: List[String], val parameterName: String, val locParams: LocParam[Unit]*) extends Loc[Unit] { override val defaultValue = Full(()) override val params = locParams.toList override val link: Link[Unit] = (List(path.first), true) def this (name: String, path: List[String], text: LinkText[Unit], methods: List[String], locParams: LocParam[Unit]*) = { this (name, path, text, methods, "id", locParams:_*) } private def isTarget (path: ParsePath) = { path.partPath -- this.path match { case List (action, id) => { (methods contains action) && id != "index" } case _ => false } } override def rewrite = Full (NamedPF("RESTfulLoc") { case RewriteRequest (path, _, _) if isTarget(path) => { val parameter = path.partPath.last val action = path.partPath.init val data = Map (parameterName -> parameter) RewriteResponse(action, data) -> () } }) } On 1月10日, 下午4時55分, Marius <marius.dan...@gmail.com> wrote: > Or you could use something like if you'r building REST API's: > > LiftRules.dispatch.append { > > case Req("test" :: _, suffix, reqType) => // return a () => > LiftResponse > > } > > or for non REST API you could use > > LiftRules.statefulRewrite.append { > > case RewriteRequest(ParsePath("test" :: _, _, _, _), reqType, request) > => ... > > } > > Br's, > Marius > > On Jan 10, 7:32 am, Brian Hsu <brianhsu....@gmail.com> wrote: >
-- You received this message because you are subscribed to the Google Groups "Lift" group. To post to this group, send email to lift...@googlegroups.com. To unsubscribe from this group, send email to liftweb+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/liftweb?hl=en.