web-dev-qa-db-ja.com

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

Play 2.4をインストールし、IntelliJ Idea 14を使用してactivatorテンプレートを使用してプロジェクトを作成しました。

44
arjayads

ビューにimplicit messagesパラメータを追加した後、次のインポートを追加し、追加の変更なしで古いコントローラクラスまたはオブジェクトを使用できます。

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

ビューフォームヘルパー(@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> 
  ...

次に、アプリケーションコントローラーで、このパラメーターをスコープで暗黙的に使用可能にする必要があります。これを行う最も簡単な方法は、playの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の独自の実装を使用できます。 playはMessagesApiをインジェクトする方法をデフォルトで知っているので、コントローラーに@Injectの注釈を付けて、playに作業を任せることができます。

マティアスブラウンが言ったように、あなたも設定する必要があります

routesGenerator := InjectedRoutesGenerator

あなたのbuild.sbt

I18nの詳細については、 https://www.playframework.com/documentation/2.4.x/ScalaI18N を参照してください。

43
Roman

フォームヘルパーを使用するには、暗黙的な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 {
1
arvind grey