David, This is an excellent example of something that I was extremely frustrated with the first week learning Scala and Lift. I suspect it would make a great edition to the wiki, FAQ, and book as well; and save us newbs some time and heartache. If I could make one additional suggestion, it would be to also give an example of using a foreign key in a Select input (fairly common case). Having this close by the foreign key example would be handy.
Something like: def add(form: NodeSeq) = { val refersto : RefersTo = RefersTo.create val allTargets = Target.allTargets.map(targ => (targ.id.toString, targ.name.toString)) def doBind(form: NodeSeq) = { bind("refto", form, "name" -> refersto.name.toForm, "taget" -> select(allTargets, Full (refersto.target.toString), refersto.target.setFromAny), "submit" -> submit("Add Event", checkAndSave) ) } def checkAndSave(): Unit = { event.validate match { case Nil => event.save ; S.notice("Added: " + event.name) case xs => S.error(xs) ; S.mapSnippet("Events.add", doBind) } } doBind(form); } Thanks for all your work on Lift. I look forward to being more able to contribute to Lift in the future. Great question Hannes. -Grant On Aug 19, 11:47 am, David Pollak <feeder.of.the.be...@gmail.com> wrote: > > First, please take a look > athttp://blog.lostlake.org/index.php?/archives/50-The-Scala-Option-clas... > It's a discussion about Option, which provides a subset of what Lift's Box > provides. It's also based on Scala 2.3 syntax... but you'll get the idea of > what Option/Box is all about. > > So, if you've got a LongKeyedMapper that is a target of a foreign key > reference from another Mapper class: > > class Taget extends LongKeyedMapper[Target] with IdPK { > ... > > object name extends MappedString(this, 64) > > } > > class RefersTo extends Mapper[RefersTo] { > object target extends MappedLongForeignKey(this, Target) > > } > > So, if I've got a RefersTo instance and I want to get the name from the > target foreign key reference: > > val rt: RefersTo = ... > val target: Box[Target] = rt.target.obj // load the FK reference, if you can > val nameBox: Box[String] = target.map(_.name.is) // you need the "is" part > so you get the String, not the MappedString > val name: String = nameBox openOr "N/A" > > But we can shorten the whole thing to: > > val name = rt.target.obj.map(_.name.is) openOr "N/A" > > In general, when you're starting out, write out the complex expressions as > separate lines with the types explicitly declared. Then refactor over and > over to make the code more concise. It might be worthwhile to leave the > original code in a comment so you can remind yourself the "exploded" view of > the expression. > > > > > thanks --~--~---------~--~----~------------~-------~--~----~ 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 -~----------~----~----~----~------~----~------~--~---