2017-07-22 4 views
0

Ich habe eine Enumeration der Form:Wie bindet man eine Enumeration an ein Playframework-Formular?

object MatchFilterType extends Enumeration { 
    type MatchFilterType = Value 
    val gt = Value("gt") 
    val lt = Value("lt") 
    val eq = Value("eq") 
} 

Den Versuch, eine Form val in meinem Controller zu erstellen:

case class SearchRequest(mft: MatchFilterType, queryText: String, locations: List[String]) 

val searchForm: Form[SearchRequest] = Form(
    mapping(
     "mft" -> ????????, 
     "queryText" -> nonEmptyText, 
     "locations" -> list(text) 
    )(SearchRequest.apply)(SearchRequest.unapply) 
) 

ich für dieses Projekt spielen 2.6.x verwenden.

Wie mappe ich meine Aufzählung in meinem Formular val?

Antwort

2

Zuerst ein implizites Formatter erstellen, die die enums withName Methode verwendet, die einen String und wandelt es in ein ENUM:

implicit def matchFilterFormat: Formatter[MatchFilterType] = new Formatter[MatchFilterType] { 

    override def bind(key: String, data: Map[String, String]) = 
    data.get(key) 
     .map(MatchFilterType.withName(_)) 
     .toRight(Seq(FormError(key, "error.required", Nil))) 

    override def unbind(key: String, value: MatchFilterType) = 
    Map(key -> value.toString) 
} 

Dann Forms.of zum Erstellen eines FieldMapping:

Form(..., 
    "mft" -> Forms.of[MatchFilterType], 
    ...) 

Bär in beachten Sie, dass MatchFilterType.withName(_) eine Ausnahme ausgelöst wird, wenn die Zeichenfolge kein Aufzählungsmember ist, aktualisieren Sie daher die bind-Methode, um dies so zu handhaben, wie Sie benötigen.

+0

Können Sie mir erklären, warum ich diesen Formatierer erstellen muss? die Theorie dahinter :) – Blankman

+0

Wie würde ich das optional machen? – Blankman

+1

@Blankman, um es optional zu machen, wickeln Sie einfach das Mapping in ein 'optional':' "mft" -> optional (Forms.of [MatchFilterType]) '. Sie müssen 'SearchRequest' aktualisieren, um eine' Option [MatchFilterType] 'zu übernehmen. Für die Theorie siehe https://www.playframework.com/documentation/2.6.x/ScalaForms#custom-binders-for-form-mappings –

Verwandte Themen