我已经让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")
}
在这里,我得到了这个"缺少参数类型"隐式请求的错误 我做错了什么? 提前致谢
答案 0 :(得分:0)
注意:我是Play / Scala的新手。可能有一个更简单的解决方案。
可能您和我有相同的情况。 最初尝试实现类似于https://www.playframework.com/documentation/2.6.x/ScalaActionsComposition#Putting-it-all-together
中的示例的代码困难在于实施行动链要比将它们“整合在一起”短。例如,我只需要根据ID来优化操作,但不需要任何身份验证。
因此,我只需要spawn do
Kemal.run
end
spawn do
# constant computation/loop with no IO
some_func
end
Fiber.yield
# or sleep
userAction andThen ItemAction(itemId) andThen PermissionCheckAction
当您尝试幼稚地删除其他2个动作功能时,我遇到了相同的错误。 我认为问题在于指南中的userAction指定/定义了请求将使用的主体解析器。
通过删除此部分,您的请求不知道主体解析器的类型,因此不知道请求[A]的[A],因此抱怨类型
我的修正:使用一个动作类(而不只是函数),该动作类可以将身体解析器传递到构造函数中
ItemAction(itemId)
我的控制器有
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)
)
}
}
我无法使用动作组合功能来避免OP的错误,而不是使用扩展了ActionBuilder的类。