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

时间:2017-01-20 18:45:16

标签: scala playframework implicit

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

我认为这是一个微不足道的解决方案,但我是玩游戏和scala的新手,并且会感激任何提示。

错误:(14,45)找不到参数消息的隐含值:play.api.i18n.Messages       "用户名" - > email.verifying(消息(" 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
  )

}

2 个答案:

答案 0 :(得分:1)

您需要使用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特征中)。

答案 1 :(得分:0)

如果您隐式向这样的表单提供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 class Data(
    username: String,
    password: String
  )

object Data {
  def form(implicit lang: Lang) = ...
}