[Lift] Re: What am I doing wrong?
You are using a dispatch snippet, which means the name after . in the lift tag is passed to the dispatch method of your snippet, rather than using reflection to find a method with the same name. So, you need to add: case addGame = addGame to your def dispatch -Ross On Oct 6, 2009, at 11:19 AM, Rick R wrote: I have added a mapping of game_state to the DispatchSnippet GameState. This works for game_state.list, but fails for game_state.addGame, shown below. What did I screw up this time? WARN - Snippet Failure: SnippetFailure(/ - ParsePath(List (index),,true,false),Full(game_store.addGame),Stateful Snippet: Dispatch Not Matched) lift:surround with=default at=content lift:game_store.list div id=game_list ul game:list ligame:idgid/game:id game:namegname/game:name/li /game:list /ul /div /lift:game_store.list lift:game_store.addGame form=post div hr/ p Create a new game: /p pName game:nomName/game:nom /p p game:submit buttonCreate/button /game:submit /p /div /lift:game_store.addGame /lift:surround class Boot { def boot { // where to search snippet LiftRules.addToPackages(com.redlemurgames) LiftRules.snippetDispatch.append( Map(game_store - GameStore) ) val entries = Menu(Loc(Home, List(index), Home)) :: Nil LiftRules.setSiteMap(SiteMap(entries:_*)) } object GameStore extends DispatchSnippet { private val gameMap = new HashMap[String, Game] def dispatch = { case list = list } def list(html: NodeSeq) : NodeSeq = bind(game, html, list - gameMap.values.toList.flatMap { gm = bind(game, html, id - Text(gm.getId), name - Text(gm.getName) ) } ) def addGame(form: NodeSeq) : NodeSeq = { val id = randomString(12) var gname : String = def checkAndSave(): Unit = if (gname.isEmpty) { S.error(String cannot be empty) ; S.mapSnippet(game_store.add, doBind) } { val ngame = new Game(id, gname, new HashSet[(String, Actor)]); gameMap += id - ngame; ngame ! Init(); S.notice(Added + ngame.getName) } def doBind(form: NodeSeq) : NodeSeq = { println(doBind was called) bind(game, form, nom - text(gname, gname = _), submit - submit(New, checkAndSave)) } doBind(form) } --~--~-~--~~~---~--~~ You received this message because you are subscribed to the Google Groups Lift group. To post to this group, send email to liftweb@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 -~--~~~~--~~--~--~---
[Lift] Re: What am I doing wrong?
Geez. I knew I was overlooking something stupid. Thanks for your help. On Tue, Oct 6, 2009 at 11:49 AM, Ross Mellgren dri...@gmail.com wrote: You are using a dispatch snippet, which means the name after . in the lift tag is passed to the dispatch method of your snippet, rather than using reflection to find a method with the same name. So, you need to add: case addGame = addGame to your def dispatch -Ross On Oct 6, 2009, at 11:19 AM, Rick R wrote: I have added a mapping of game_state to the DispatchSnippet GameState. This works for game_state.list, but fails for game_state.addGame, shown below. What did I screw up this time? WARN - Snippet Failure: SnippetFailure(/ - ParsePath(List (index),,true,false),Full(game_store.addGame),Stateful Snippet: Dispatch Not Matched) lift:surround with=default at=content lift:game_store.list div id=game_list ul game:list ligame:idgid/game:id game:namegname/game:name/li /game:list /ul /div /lift:game_store.list lift:game_store.addGame form=post div hr/ p Create a new game: /p pName game:nomName/game:nom /p p game:submit buttonCreate/button /game:submit /p /div /lift:game_store.addGame /lift:surround class Boot { def boot { // where to search snippet LiftRules.addToPackages(com.redlemurgames) LiftRules.snippetDispatch.append( Map(game_store - GameStore) ) val entries = Menu(Loc(Home, List(index), Home)) :: Nil LiftRules.setSiteMap(SiteMap(entries:_*)) } object GameStore extends DispatchSnippet { private val gameMap = new HashMap[String, Game] def dispatch = { case list = list } def list(html: NodeSeq) : NodeSeq = bind(game, html, list - gameMap.values.toList.flatMap { gm = bind(game, html, id - Text(gm.getId), name - Text(gm.getName) ) } ) def addGame(form: NodeSeq) : NodeSeq = { val id = randomString(12) var gname : String = def checkAndSave(): Unit = if (gname.isEmpty) { S.error(String cannot be empty) ; S.mapSnippet(game_store.add, doBind) } { val ngame = new Game(id, gname, new HashSet[(String, Actor)]); gameMap += id - ngame; ngame ! Init(); S.notice(Added + ngame.getName) } def doBind(form: NodeSeq) : NodeSeq = { println(doBind was called) bind(game, form, nom - text(gname, gname = _), submit - submit(New, checkAndSave)) } doBind(form) } --~--~-~--~~~---~--~~ You received this message because you are subscribed to the Google Groups Lift group. To post to this group, send email to liftweb@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 -~--~~~~--~~--~--~---
[Lift] Re: What am I doing wrong?
In your bind, you don't capture the nodes inside games:show, so the inner bind is binding the same nodes as the outer bind. Change: bind(games, html, show - gameMap.values.toList.flatMap to: bind(games, html, show - { (html: NodeSeq) = gameMap.values.toList.flatMap ... Here is a working version: http://github.com/Dridus/rickr-lift-test -Ross On Oct 6, 2009, at 3:28 PM, Rick R wrote: My clipboard seems to have broken, so I'm attaching the index.html On Tue, Oct 6, 2009 at 2:57 PM, Ross Mellgren dri...@gmail.com wrote: I'd have to see your revised template, since I don't see games:show there, but this error indicates that you're not within a bind -- usually because you're not in a snippet when you think you are, or when you're using a bound prefix inside some other bind. What does your template look like? -Ross On Oct 6, 2009, at 2:47 PM, Rick R wrote: Actually.. I'm running into a similar problem, this time it is dispatching correctly, but failing when rendering games.show. XML Parsing Error: prefix not bound to a namespace Location: http://localhost:8080/ Line Number 20, Column 7: games:show --^ def dispatch = { case list = list case add = addGame } def list(html: NodeSeq) : NodeSeq = bind(games, html, show - gameMap.values.toList.flatMap { gm = bind(game, html, id - Text(gm.getId), name - Text(gm.getName) ) } On Tue, Oct 6, 2009 at 1:21 PM, Rick R rick.richard...@gmail.com wrote: Geez. I knew I was overlooking something stupid. Thanks for your help. On Tue, Oct 6, 2009 at 11:49 AM, Ross Mellgren dri...@gmail.com wrote: You are using a dispatch snippet, which means the name after . in the lift tag is passed to the dispatch method of your snippet, rather than using reflection to find a method with the same name. So, you need to add: case addGame = addGame to your def dispatch -Ross On Oct 6, 2009, at 11:19 AM, Rick R wrote: I have added a mapping of game_state to the DispatchSnippet GameState. This works for game_state.list, but fails for game_state.addGame, shown below. What did I screw up this time? WARN - Snippet Failure: SnippetFailure(/ - ParsePath(List (index),,true,false),Full(game_store.addGame),Stateful Snippet: Dispatch Not Matched) lift:surround with=default at=content lift:game_store.list div id=game_list ul game:list ligame:idgid/game:id game:namegname/game:name/li /game:list /ul /div /lift:game_store.list lift:game_store.addGame form=post div hr/ p Create a new game: /p pName game:nomName/game:nom /p p game:submit buttonCreate/button /game:submit /p /div /lift:game_store.addGame /lift:surround class Boot { def boot { // where to search snippet LiftRules.addToPackages(com.redlemurgames) LiftRules.snippetDispatch.append( Map(game_store - GameStore) ) val entries = Menu(Loc(Home, List(index), Home)) :: Nil LiftRules.setSiteMap(SiteMap(entries:_*)) } object GameStore extends DispatchSnippet { private val gameMap = new HashMap[String, Game] def dispatch = { case list = list } def list(html: NodeSeq) : NodeSeq = bind(game, html, list - gameMap.values.toList.flatMap { gm = bind(game, html, id - Text(gm.getId), name - Text(gm.getName) ) } ) def addGame(form: NodeSeq) : NodeSeq = { val id = randomString(12) var gname : String = def checkAndSave(): Unit = if (gname.isEmpty) { S.error(String cannot be empty) ; S.mapSnippet(game_store.add, doBind) } { val ngame = new Game(id, gname, new HashSet[(String, Actor)]); gameMap += id - ngame; ngame ! Init(); S.notice(Added + ngame.getName) } def doBind(form: NodeSeq) : NodeSeq = { println(doBind was called) bind(game, form, nom - text(gname, gname = _), submit - submit(New, checkAndSave)) } doBind(form) } index.html --~--~-~--~~~---~--~~ You received this message because you are subscribed to the Google Groups Lift group. To post to this group, send email to liftweb@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