Hello everybody,

Still trying to learn how to use lift efficiently and effectively, I  
got a little bit confused about the toForm function in the model/ 
mappers. Admittedly, my web framework background may be limited, but  
this looked to me as if some view code snuck into the model space  
there (I must admit that I do like how RoR tries to keep the models  
fairly clean of both controller  code and of view code).

For my first little project, I was going to encapsulate the HTML field  
formatting into a separate class (similar to what RoR does, but making  
use of the type system).

This is a very quick brain dump, not running code.

// The different field types, at a higher level than HTML
abstract class InputType
case class TextField extends InputType
case class DateField extends InputType
case class DateTimeField extends InputType

// Rendering hints that an form field formatter may use, could also be  
called FormGenerator ...
abstract class RenderingHint
case class MinLength(l: Int) extends RenderingHint
case class MaxLength(l: Int) extends RenderingHint

// Input-type aware callback'ed formatter, from the model's perspective
trait InputTypeHandler {
   def handleTextField(fieldID: String, presetValue: String,  
renderingHints: RenderingHint*)

   def handleDateField(fieldID: String, presetValue: Date,  
renderingHints: RenderingHint*)

// A model class using the callback
class ModelClass {
   object aField extends MappedString(this, 128) {
     def inputTypeCallback(InputTypeHandler handler) {
       // A reasonable default should/could be pushed upwards in the  
type hierarchy
       handler.handleTextField(fieldID, this.is, MaxLength(this.length))

This InputTypeHandler could be a nice spot to deal with validation  
result formatting:

class AnInputFormatter(errors: List[FieldError]) extends  
InputTypeHandler {
   def handleTextField(fieldID: String, presetValue: String,  
renderingHints: RenderingHint*) {
     errors.filter(_._1 == fieldID).match {
       case Nil => /* format field normally */
       case xs => /* format as error, i.e. red background, error  
messages right of field .... */


// A snippet
val inputFormatter = new AnInputFormatter(errorsFromValidation)
bind("form", html, "aField" -> aModelClass.aField.  

Maybe a partial function, potentially on case classes, is better? Many  
options ...

I'm looking forward to any feedback.


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 
For more options, visit this group at 

Reply via email to