播放2.4:窗体:找不到参数消息的隐式值:play.api.i18n.Messages

我是新玩框架,并试图模仿我的本地机器helloworld样本,但我遇到了一个错误:

在这里输入图像描述

路线:

# Home page GET / controllers.Application.index # Hello action GET /hello controllers.Application.sayHello # Map static resources from the /public folder to the /assets URL path GET /assets/*file controllers.Assets.versioned(path="/public", file: Asset) 

控制器:

 package controllers import play.api.mvc._ import play.api.data._ import play.api.data.Forms._ import views._ class Application extends Controller { val helloForm = Form( tuple( "name" -> nonEmptyText, "repeat" -> number(min = 1, max = 100), "color" -> optional(text) ) ) def index = Action { Ok(html.index(helloForm)) } def sayHello = Action { implicit request => helloForm.bindFromRequest.fold( formWithErrors => BadRequest(html.index(formWithErrors)), {case (name, repeat, color) => Ok(html.hello(name, repeat.toInt, color))} ) } } 

视图:

 @(helloForm: Form[(String,Int,Option[String])]) @import helper._ @main(title = "The 'helloworld' application") { <h1>Configure your 'Hello world':</h1> @form(action = routes.Application.sayHello, args = 'id -> "helloform") { @inputText( field = helloForm("name"), args = '_label -> "What's your name?", 'placeholder -> "World" ) @inputText( field = helloForm("repeat"), args = '_label -> "How many times?", 'size -> 3, 'placeholder -> 10 ) @select( field = helloForm("color"), options = options( "" -> "Default", "red" -> "Red", "green" -> "Green", "blue" -> "Blue" ), args = '_label -> "Choose a color" ) <p class="buttons"> <input type="submit" id="submit"> <p> } } 

我有Play 2.4安装,并通过激活模板使用IntelliJ Idea 14创build项目。

implicit messages参数添加到视图后,您可以添加以下导入并使用旧的控制器类甚至对象,而无需进行任何其他更改:

 import play.api.Play.current import play.api.i18n.Messages.Implicits._ 

使用视图表单助手(比如@inputText )需要你传递一个隐式的play.api.i18n.Messages参数给你的视图。 您可以添加(implicit messages: Messages)到您的视图中的签名。 你的看法变成这样:

 @(helloForm: Form[(String,Int,Option[String])])(implicit messages: Messages) @import helper._ @main(title = "The 'helloworld' application") { <h1>Configure your 'Hello world':</h1> ... 

然后在您的应用程序控制器中,您必须使该参数在您的范围内隐式可用。 最简单的方法是实现游戏的I18nSupport特性。

在你的例子中,这看起来像这样:

 package controllers import play.api.mvc._ import play.api.data._ import play.api.data.Forms._ import javax.inject.Inject import play.api.i18n.I18nSupport import play.api.i18n.MessagesApi import views._ class Application @Inject()(val messagesApi: MessagesApi) extends Controller with I18nSupport { val helloForm = Form( tuple( "name" -> nonEmptyText, "repeat" -> number(min = 1, max = 100), "color" -> optional(text) ) ) def index = Action { Ok(html.index(helloForm)) } def sayHello = Action { implicit request => helloForm.bindFromRequest.fold( formWithErrors => BadRequest(html.index(formWithErrors)), {case (name, repeat, color) => Ok(html.hello(name, repeat.toInt, color))} ) } } 

在你的控制器中,你当然可以使用你自己的MessagesApi实现。 由于玩游戏知道如何注入一个MessagesApi你可以简单地用@Inject注释你的控制器,让游戏为你做好工作。

正如Matthias Braun所说,你也必须设定

 routesGenerator := InjectedRoutesGenerator 

在你的build.sbt

有关I18n的更多信息,请参见https://www.playframework.com/documentation/2.4.x/ScalaI18N

使用表单助手需要你传递一个隐式的play.api.i18n.Messages参数给你的视图。 你可以在你的视图中添加(implicit messages: Messages) 。 你的看法变成这样:

 @(contacts: List[models.Contact], form: Form[models.Contact])(implicit messages: Messages) 

然后手动注入您的控制器

 import play.api.data.Forms._ import javax.inject.Inject import play.api.i18n.I18nSupport import play.api.i18n.MessagesApi 

然后最后添加到您的主索引控制器类

 class Application @Inject()(val messagesApi: MessagesApi) extends Controller with I18nSupport {