Play 2.4: Form: imansible trovare il valore implicito per i messaggi dei parametri: play.api.i18n.Messages

Sono nuovo di Play framework e ho provato a imitare l’esempio di helloworld nella mia macchina locale, ma ho riscontrato un errore:

inserisci la descrizione dell'immagine qui

itinerari:

# 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) 

Controller:

 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))} ) } } 

vista:

 @(helloForm: Form[(String,Int,Option[String])]) @import helper._ @main(title = "The 'helloworld' application") { 

Configure your 'Hello world':

@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" )

} }

Ho installato Play 2.4 e ho creato il progetto usando IntelliJ Idea 14 tramite template triggerstore .

Dopo aver aggiunto i parametri dei implicit messages alle viste, puoi semplicemente aggiungere le seguenti importazioni e utilizzare le vecchie classi di controller o anche gli oggetti senza modifiche aggiuntive:

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

L’utilizzo degli helper del modulo di visualizzazione (come @inputText ) richiede il passaggio di un parametro implicito play.api.i18n.Messages alla vista. Puoi farlo aggiungendo (implicit messages: Messages) alla firma nella tua vista. La tua vista diventa questa:

 @(helloForm: Form[(String,Int,Option[String])])(implicit messages: Messages) @import helper._ @main(title = "The 'helloworld' application") { 

Configure your 'Hello world':

...

Quindi nel controller dell’applicazione è necessario rendere questo parametro implicitamente disponibile nel proprio ambito. Il modo più semplice per farlo è implementare il tratto I18nSupport di I18nSupport .

Nel tuo esempio, questo sarebbe simile a questo:

 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))} ) } } 

Nel tuo controller puoi ovviamente utilizzare la tua implementazione di MessagesApi . Dal momento che il gioco sa @Inject come iniettare un @Inject puoi semplicemente annotare il tuo controller con @Inject e lasciare che il gioco faccia il lavoro per te.

Come ha detto Matthias Braun, devi anche impostare

 routesGenerator := InjectedRoutesGenerator 

nel tuo build.sbt

Vedere https://www.playframework.com/documentation/2.4.x/ScalaI18N per ulteriori informazioni su I18n.

L’uso degli helper per moduli richiede di passare un parametro implicito play.api.i18n.Messages alla vista. Puoi farlo aggiungendo (implicit messages: Messages) nella tua vista. La tua vista diventa questa:

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

Quindi iniettare manualmente nei controller

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

quindi aggiungi infine la tua class di controller dell’indice principale

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