webentwicklung-frage-antwort-db.com.de

Play 2.4: Form: Konnte keinen impliziten Wert für Parameternachrichten finden: play.api.i18n.Messages

Ich bin neu in Play Framework und habe versucht, das Beispiel helloworld auf meinem lokalen Computer nachzuahmen, aber es ist ein Fehler aufgetreten:

enter image description here

routen:

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

view:

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

Ich habe Play 2.4 installiert und das Projekt mit IntelliJ Idea 14 über die Vorlage activator erstellt.

44
arjayads

Nach dem Hinzufügen von implicit messages -Parameter zu Ansichten können Sie einfach die folgenden Importe hinzufügen und die alten Controller-Klassen oder sogar Objekte ohne zusätzliche Änderungen verwenden:

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

Für die Verwendung von Ansichtsformular-Hilfsprogrammen (z. B. @inputText) Müssen Sie einen impliziten play.api.i18n.Messages - Parameter an Ihre Ansicht übergeben. Sie können dies tun, indem Sie der Signatur in Ihrer Ansicht (implicit messages: Messages) Hinzufügen. Ihre Ansicht wird so:

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

@import helper._

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

Dann müssen Sie in Ihrem Anwendungscontroller diesen Parameter implizit in Ihrem Bereich verfügbar machen. Der einfachste Weg, dies zu tun, besteht darin, das Merkmal I18nSupport Des Spiels zu implementieren.

In Ihrem Beispiel würde das so aussehen:

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

In Ihrem Controller können Sie natürlich Ihre eigene Implementierung von MessagesApi verwenden. Da play von Anfang an weiß, wie ein MessagesApi injiziert wird, können Sie Ihren Controller einfach mit @Inject Versehen und play die Arbeit für Sie erledigen lassen.

Wie Matthias Braun sagte, muss man auch einstellen

routesGenerator := InjectedRoutesGenerator

in deinem build.sbt

Weitere Informationen zu I18n finden Sie unter https://www.playframework.com/documentation/2.4.x/ScalaI18N .

43
Roman

Für die Verwendung von Formular-Hilfsprogrammen müssen Sie einen impliziten play.api.i18n.Messages - Parameter an Ihre Ansicht übergeben. Sie können dies tun, indem Sie Ihrer Ansicht (implicit messages: Messages) Hinzufügen. Ihre Ansicht wird so:

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

Dann injizieren Sie manuell in Ihre Controller

import play.api.data.Forms._

import javax.inject.Inject

import play.api.i18n.I18nSupport

import play.api.i18n.MessagesApi 

fügen Sie dann schließlich zu Ihrer Hauptindex-Controller-Klasse hinzu

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