我已经让 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 =>
Ok("Ok")
}
在这里,我收到了隐式请求的“缺少参数类型”错误
我做错了什么?
提前致谢
最佳答案
注意:我是 Play/Scala 的新手。可能有更简单的解决方案。
可能你有和我一样的场景。
最初尝试实现类似于 https://www.playframework.com/documentation/2.6.x/ScalaActionsComposition#Putting-it-all-together 中示例的代码
困难在于实现比“将它们放在一起”更短的行动链。例如,我只需要根据 ID 优化操作,但我不需要任何身份验证。
所以,而不是拥有 userAction andThen ItemAction(itemId) andThen PermissionCheckAction
, 我只需要 ItemAction(itemId)
我遇到了与您试图天真地删除其他 2 个 Action 功能相同的错误。
我认为问题在于指南中的 userAction 指定/定义请求将使用的正文解析器。
通过删除这部分,您的请求不知道正文解析器的类型,因此它不知道请求 [A] 的 [A],因此提示类型
我的修复:使用 Action 类(而不仅仅是函数),它可以将主体解析器传递给构造函数
class LeagueRequest[A](val league: League, request: Request[A]) extends WrappedRequest[A](request)
class LeagueAction(val parser: BodyParser[AnyContent], leagueId: String)(implicit val ec: ExecutionContext) extends ActionBuilder[LeagueRequest, AnyContent] with ActionRefiner[Request, LeagueRequest]{
def executionContext = ec
override def refine[A](input: Request[A]) = Future.successful {
inTransaction(
(for {
leagueIdLong <- IdParser.parseLongId(leagueId, "league")
league <- AppDB.leagueTable.lookup(leagueIdLong).toRight(NotFound(f"League id $leagueId does not exist"))
out <- Right(new LeagueRequest(league, input))
} yield out)
)
}
}
我的 Controller 有
def get(leagueId: String) = (new LeagueAction(parse.default, leagueId)).async { implicit request =>
Future(Ok(Json.toJson(request.league)))
}
我无法使用 Action 组合函数而不是扩展 ActionBuilder 的类来避免 OP 的错误。
关于scala - 在 ActionRefiner 之后,Play Framework 2.4 Scala 缺少 Action 中隐式请求的参数类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35956630/