forms scala playframework playframework-2.4

forms - Juego 2.4: Forma: no se pudo encontrar el valor implícito para los mensajes de parámetros: play.api.i18n.Messages



scala playframework (3)

Después de agregar parámetros de implicit messages a las vistas, puede agregar las siguientes importaciones y usar las antiguas clases de controlador o incluso los objetos sin ningún cambio adicional:

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

Soy nuevo en Play Framework e intenté imitar la muestra de helloworld en mi máquina local, pero encontré un error:

rutas:

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

controlador:

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

ver:

@(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> } }

Tengo Play 2.4 instalado y creé el proyecto usando IntelliJ Idea 14 a través de la plantilla activadora .


El uso de ayudantes de formulario de vista (como @inputText ) requiere que pase un parámetro implícito play.api.i18n.Messages a su vista. Puede hacer esto agregando (implicit messages: Messages) a la firma en su vista. Su punto de vista se convierte en esto:

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

Luego, en el controlador de la aplicación, debe hacer que este parámetro esté implícitamente disponible en su ámbito. La forma más sencilla de hacer esto es implementar el rasgo I18nSupport de I18nSupport .

En su ejemplo, esto se vería así:

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

En su controlador, por supuesto, puede usar su propia implementación de MessagesApi . Dado que play sabe desde el primer momento cómo inyectar un MessagesApi , simplemente puede anotar su controlador con @Inject y dejar que play haga el trabajo por usted.

Como mencionó Matthias Braun, también debes configurar

routesGenerator := InjectedRoutesGenerator

en su build.sbt

Consulte https://www.playframework.com/documentation/2.4.x/ScalaI18N para obtener más información sobre I18n.


El uso de ayudantes de formulario requiere que pase un parámetro implícito play.api.i18n.Messages a su vista. Puede hacer esto agregando (implicit messages: Messages) en su vista. Su punto de vista se convierte en esto:

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

Luego, inyecte manualmente en sus controladores

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

luego finalmente agregue a su clase principal de controlador de índice

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