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 {