Ich bin neu in Play Framework und habe versucht, das Beispiel helloworld auf meinem lokalen Computer nachzuahmen, aber es ist ein Fehler aufgetreten:
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.
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._
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 .
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 {