2017-06-21 2 views
1

ich ein scala Enumeration wie folgt haben:Bind Enumeration auf Pfad oder Abfrage im Spiel

object SearchTypes extends Enumeration { 
    type TypeAlias = Value 
    val firstVal, secondVal, thirdVal = Value 
} 

ich es in der Lage sein möchte durch eine Abfrage-String übergeben - mein routes sieht aus wie

/search @searchController.search(searchType: SearchTypes.TypeAlias) 

Beim Versuch, die Play-Anwendung auszuführen, wird eine Reihe von Fehlern einschließlich dieser ausgegeben:

[Fehler]/Benutzer/my-user/co de/project/conf/routes: 8: Kein QueryString-Binder für den Typ SearchTypes.TypeAlias ​​gefunden. Versuchen Sie, einen impliziten QueryStringBindable für diesen Typ zu implementieren.

Wie lehre ich spielen zu analysieren, die Enumeration?

Antwort

1

Es gibt eine gute in-Tiefe Zuschreibung auf here, aber der Kern ist QueryStringBindable.Parsingin Ihrem Enumeration zu implementieren. Beispiel:

object SearchTypes extends Enumeration { 
    // other declarations 

    implicit object searchTypeQueryStringBinder 
    extends QueryStringBindable.Parsing[SearchTypes.TypeAlias](
     withName(_), 
     _.toString, 
    (k: String, e: Exception) => "Cannot parse %s as SearchTypes: %s".format(k, e.getMessage()) 
) 
} 

(. Sie anspruchsvollere fallbasierte Logik Parsing schreiben kann durch den direkten Aufruf zu withName(_) mit etwas komplizierter zu ersetzen)

Danach tun, sollte die routes zufrieden sein, weil play umwandeln kann zwischen einem string und Ihrem Enumeration.

Hinweis: Wenn Sie Ihren Enumeration direkt im Pfad anstatt in einer Abfragezeichenfolge verwenden möchten, müssen Sie PathBindable.Parsing statt QueryStringBindable.Parsing erweitern.