隐式消息编译错误在 play2.5 中



我有一个play2.5应用程序和一个表单,我想在其中将错误消息国际化。我将表单放在一个单独的对象中,并在控制器中使用它。但是播放不编译,因为找不到隐式消息。

我想这是一个微不足道的解决方案,但我是玩和 scala 的新手,如果有任何提示,我将不胜感激。

错误:(14, 45) 找不到参数消息的隐式值:play.api.i18n.消息 "username" -> email.verifying(Messages("error.email.required"), {!_.isEmpty}),

object LoginForm {
  val form = Form(
    mapping(
      "username" -> email.verifying(Messages("error.email.required"), {!_.isEmpty}),
      "pasword" -> nonEmptyText(8,20).verifying(Messages("error.password.required"), {!_.isEmpty})
    )(Data.apply)(Data.unapply)
  )
  case class Data(
    username: String,
    password: String
  )
}
您需要

使用 I18nSupport 特征来获取作用域中的隐式play.api.i18n.Messages值。 完整解释在这里:

https://www.playframework.com/documentation/2.5.x/ScalaI18N#Externalizing-messages

对于您的用例,最简单的方法是在使用I18nSupport特征的控制器内部定义表单。 由于您是Scala和Play的新手,因此我推荐这种方法。

更高级的方法是在LoginForm特征中定义形式并声明对I18nSupport特征的依赖关系。 这看起来像:

trait LoginForm{
  self: I18nSupport =>
  //define form here
}

然后,您只需将这个LoginForm特征混合到您需要它的控制器中(它应该混合在I18nSupport特征中)。

如果您像这样隐式地为表单提供 lang 是否有效?

def form(implicit lang: Lang) = Form(
    mapping(
      "username" -> email.verifying(Messages("error.email.required"), {!_.isEmpty}),
      "pasword" -> nonEmptyText(8,20).verifying(Messages("error.password.required"), {!_.isEmpty})
    )(Data.apply)(Data.unapply)
  )

有时将窗体移动到 case 类的配套对象会很好:

case class Data(
    username: String,
    password: String
  )
object Data {
  def form(implicit lang: Lang) = ...
}

最新更新