2016-03-15 83 views
0

我做了ActionRefiner在URL從參數讀取當前請求的語言參數:PlayFramework 2.4斯卡拉ActionRefiner從URL使用

class LangRequest[A](val lang: Lang, request: Request[A]) extends WrappedRequest[A](request) 

    def LangAction(lang: String) = new ActionRefiner[Request, LangRequest] { 
    def refine[A](input: Request[A]) = Future.successful { 
     val availLangs: List[String] = Play.current.configuration.getStringList("play.i18n.langs").get.toList 
     if (!availLangs.contains(lang)) 
     Left { 
      input.acceptLanguages.head match { 
      case Lang(value, _) if availLangs.contains(value) => Redirect(controllers.routes.Application.index(value)) 
      case _ => Redirect(controllers.routes.Application.index(availLangs.head)) 
      } 
     } 
     else Right { 
     new LangRequest(Lang(lang), input) 
     } 
    } 
    } 

,並嘗試使用它在行動這樣的:

def login(lng: String) = LangAction(lng) { implicit request: Request[AnyContent] => 
     Ok("Ok") 
    } 

而且我有

「play.api.mvc.ActionRefiner [play.api.mvc.Request,controllers.actionbuilders.LangRequest] 不參數「

編譯時出錯。我怎樣才能使用這個ActionRefiner?在PlayFramework文檔https://www.playframework.com/documentation/2.4.x/ScalaActionsComposition他們表現出ActionRefiner用法與過濾器,變壓器這樣的:

(UserAction andThen ItemAction(itemId) andThen PermissionCheckAction) 

,這確實工作。但如何使用一個ActionRefiner?

回答

0

對不起;這是相當古老的,但我面臨類似的問題,並希望張貼解決方案,以便其他人可以找到它。我懷疑這是因爲除了其他任何東西外,動作鏈中的第一項應該是一個ActionBuilder。 ActionTransformer不是ActionBuilder的子類型,儘管它可以是ActionBuilder#和Then的參數。