[Lift] Re: What am I doing wrong?

2009-10-06 Thread Ross Mellgren

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?

2009-10-06 Thread Rick R
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?

2009-10-06 Thread Ross Mellgren

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