Play 2.4: Форма: не удалось найти неявное значение для сообщений параметров: play.api.i18n.Messages
Я новичок в платформе Play и пытаюсь имитировать образец helloworld на моей локальной машине, но я столкнулся с ошибкой:
![enter image description here]()
<сильные > маршруты:
# 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)
контроллер:
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))}
)
}
}
Вид:
@(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 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>
}
}
У меня установлен Play 2.4 и создан проект с использованием IntelliJ Idea 14 с помощью активатора.
Ответы
Ответ 1
После добавления параметров implicit messages
к представлениям вы можете просто добавить следующие импорты и использовать старые классы контроллера или даже объекты без каких-либо дополнительных изменений:
import play.api.Play.current
import play.api.i18n.Messages.Implicits._
Ответ 2
Использование помощников формы формы формы (например, @inputText
) требует передачи неявного параметра play.api.i18n.Messages
к вашему представлению. Вы можете сделать это, добавив (implicit messages: Messages)
к подписи в вашем представлении. Ваше представление станет следующим:
@(helloForm: Form[(String,Int,Option[String])])(implicit messages: Messages)
@import helper._
@main(title = "The 'helloworld' application") {
<h1>Configure your 'Hello world':</h1>
...
Затем в вашем прикладном контроллере вы должны сделать этот параметр неявно доступным в своей области. Самый простой способ сделать это - реализовать функцию воспроизведения I18nSupport
.
В вашем примере это будет выглядеть так:
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))}
)
}
}
В вашем контроллере вы можете, конечно, использовать собственную реализацию MessagesApi
. Поскольку игра знает из коробки, как ввести MessagesApi
, вы можете просто аннотировать свой контроллер с помощью @Inject
и позволить игре выполнять эту работу за вас.
Как упоминал Маттиас Браун, вам также нужно установить
routesGenerator := InjectedRoutesGenerator
в build.sbt
Подробнее о I18n см. https://www.playframework.com/documentation/2.4.x/ScalaI18N.
Ответ 3
Используя помощники формы, вы должны передать неявный параметр play.api.i18n.Messages
к вашему представлению. Вы можете сделать это, добавив (implicit messages: Messages)
в ваш взгляд. Ваше представление станет следующим:
@(contacts: List[models.Contact],
form: Form[models.Contact])(implicit messages: Messages)
Затем вручную вводите в свои контроллеры
import play.api.data.Forms._
import javax.inject.Inject
import play.api.i18n.I18nSupport
import play.api.i18n.MessagesApi
затем, наконец, добавьте в свой основной класс контроллера указателя
class Application @Inject()(val messagesApi: MessagesApi) extends
Controller with I18nSupport {