web-dev-qa-db-fra.com

Lecture 2.4: forme: impossible de trouver la valeur implicite des messages de paramètre: play.api.i18n.Messages

Je suis nouveau dans le framework Play et j'ai essayé d'imiter l'échantillon helloworld sur ma machine locale mais j'ai rencontré une erreur:

enter image description here

routes:

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

contrôleur:

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

voir:

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

J'ai installé Play 2.4 et créé le projet à l'aide d'IntelliJ Idea 14 via le modèle activator.

44
arjayads

Après avoir ajouté implicit messages paramètres aux vues, vous pouvez simplement ajouter les importations suivantes et utiliser les anciennes classes de contrôleur ou même les objets sans aucune modification supplémentaire:

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

L'utilisation des assistants de formulaire de vue (tels que @inputText) Vous oblige à passer un paramètre implicite play.api.i18n.Messages À votre vue. Vous pouvez le faire en ajoutant (implicit messages: Messages) À la signature dans votre vue. Votre point de vue devient ceci:

@(helloForm: Form[(String,Int,Option[String])])(implicit messages: Messages)

@import helper._

@main(title = "The 'helloworld' application") { 
  <h1>Configure your 'Hello world':</h1> 
  ...

Ensuite, dans votre contrôleur d'application, vous devez rendre ce paramètre implicitement disponible dans votre portée. La façon la plus simple de le faire est d'implémenter le trait I18nSupport Du jeu.

Dans votre exemple, cela ressemblerait à ceci:

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

Dans votre contrôleur, vous pouvez bien sûr utiliser votre propre implémentation de MessagesApi. Puisque play sait comment injecter un MessagesApi, vous pouvez simplement annoter votre contrôleur avec @Inject Et laisser play faire le travail pour vous.

Comme Matthias Braun l'a mentionné, vous devez également définir

routesGenerator := InjectedRoutesGenerator

dans votre build.sbt

Voir https://www.playframework.com/documentation/2.4.x/ScalaI18N pour plus d'informations sur I18n.

43
Roman

L'utilisation des assistants de formulaire nécessite que vous passiez un paramètre implicite play.api.i18n.Messages À votre vue. Vous pouvez le faire en ajoutant (implicit messages: Messages) À votre vue. Votre point de vue devient ceci:

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

Injectez ensuite manuellement dans vos contrôleurs

import play.api.data.Forms._

import javax.inject.Inject

import play.api.i18n.I18nSupport

import play.api.i18n.MessagesApi 

puis enfin ajouter à votre classe de contrôleur d'index principal

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