문제

응용 프로그램의 호스트 이름에 따라 로켈을 요청 객체로 강제로 강제로 설정했습니다.이것은 구성 맵을 읽음으로써 수행됩니다

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)) ) 
  }

}
.

코드는 컴파일되지 않습니다.그것은 말한다 :

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

모든 제안?

주의 사항 : 내 목표를 달성하기 위해 나쁜 접근 방식을 사용했을 수도 있으므로, 제안하는 것이 더 나은 것이 있다면, 당신의 조언을 기쁘게 생각합니다.

도움이 되었습니까?

해결책

ymmm - PlainResult에서 SimpleResult에서 PLAY의 전환과 관련된 버그를 누르는 것 같습니다.

2.2.0 코드베이스를 볼 때 PlainResult는 다음과 같습니다.

sealed trait PlainResult extends Result with WithHeaders[PlainResult]
.

SimpleResult는 다음과 같이 정의됩니다 :

case class SimpleResult(...) extends PlainResult
.

... WithHeaders 메소드가 PlainResult를 리턴하는 것을 의미합니다.

2.2.x 코드베이스의 github recified :

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

... 릴리스 후보를 사용하는 것이 기쁘게 생각하는 경우 릴리스 노트 .

그렇지 않은 경우, 헬퍼 메소드를 사용하여 문제를 해결하십시오.

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))
  }
}
.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top