Frage

Ich habe versucht, das Gebietsschema abhängig vom Hostnamen der Anwendung in das Request-Objekt einzufügen.Dies erfolgt durch das Auslesen einer Konfigurationskarte

package controllers

import play.api.mvc._
import play.api.i18n.Lang
import play.api.Play.current
import scala.actors.Future

object Global extends WithFilters(ForceLocalization)

object ForceLocalization extends Filter {

  override def apply(next: (RequestHeader) => Future[SimpleResult])
                    (rh: RequestHeader): Future[SimpleResult] = {
    val arr = models.DomainSettings.forDomain(rh.domain).locale.split("_") // -> "en_US"
    val language = arr(0) // -> "en"
    val country = if ( arr.length == 1 ) "" else arr(1) // -> "US"
    f(rh).map( _.withLang(Lang(language, country)) ) 
  }

}

Der Code lässt sich nicht kompilieren.Es sagt:

type mismatch:
  [error]  found   : play.api.mvc.PlainResult
  [error]  required: play.api.mvc.SimpleResult
  [error]     f(rh).map( _.withLang(Lang(language, country)) ) 

Irgendein Vorschlag?

Beachten:Möglicherweise habe ich einen schlechten Ansatz gewählt, um mein Ziel zu erreichen. Wenn Sie also etwas Besseres vorzuschlagen haben, freue ich mich über Ihren Rat.

War es hilfreich?

Lösung

Hmmm, es scheint, als ob Sie einen Fehler im Zusammenhang mit der Umstellung von Play entdeckt haben PlainResult Zu SimpleResult.

Wenn ich in die schaue 2.2.0 Codebasis, PlainResult Ist:

sealed trait PlainResult extends Result with WithHeaders[PlainResult]

Und SimpleResult ist definiert als:

case class SimpleResult(...) extends PlainResult

...was bedeutet, dass alle WithHeaders Methoden werden zurückgegeben PlainResults - was falsch ist.

Ich stelle fest, dass in der 2.2.x-Codebasis auf GitHub, es wurde behoben:

case class SimpleResult(...) extends PlainResult with WithHeaders[SimpleResult]

...und wenn Sie gerne einen Release Candidate verwenden möchten, können Sie ihn verwenden 2.2.2-RC1 das den Fix enthält, laut der Versionshinweise.

Wenn nicht, verwenden Sie eine Hilfsmethode, um das Problem zu umgehen, indem Sie Folgendes tun WithHeaders.withLang tut es trotzdem:

object ForceLocalization extends Filter {

  override def apply(next: (RequestHeader) => Future[SimpleResult])
                    (rh: RequestHeader): Future[SimpleResult] = {
    ...
    next(rh).map( withLang(_, Lang(language, country)) )
  }

  private def withLang(sr:SimpleResult, lang:Lang) = {
    sr.withCookies(Cookie(Play.langCookieName, lang.code))
  }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top