【问题标题】:Could not find implicit value for parameter messages找不到参数消息的隐式值
【发布时间】:2016-02-22 01:22:29
【问题描述】:

我是 Scala 和 Play 的新手,所以我想从一个简单的基本形式开始(遵循 Play 教程)。我已经尝试解决以下错误 2 天了:

找不到参数消息的隐含值:play.api.i18n.Messages
formWithErrors => BadRequest(views.html.contact.index(formWithErrors))

这是我目前的代码:

控制器:

package controllers.contact

import play.api._
import play.api.mvc._
import models.contact.UserData

class ContactController extends Controller {
    def index = Action {
        Ok(views.html.contact.index(UserData.form))
    }

    def create = Action { implicit request =>
        UserData.form.bindFromRequest().fold(
                formWithErrors => BadRequest(views.html.contact.index(formWithErrors)),
                customer => Ok(s"Customer ${customer.name} created")
            )
    }
}

查看:

@import play.api.data.Form
@import helper._
@import models.contact.UserData
@(form: Form[UserData])(implicit messages: Messages)

@main("") {
    @helper.form(action = controllers.contact.routes.ContactController.create()) {
        @helper.inputText(form("name"))
        @helper.inputText(form("age"))
        <input type="submit" value="Submit">
    }
}

型号:

package models.contact

import play.api.data._
import play.api.data.Forms._

case class UserData(val name: String, val age: Int)

object UserData {
    val form = Form(
            mapping (
                "name" -> text,
                "age" -> number
            )(UserData.apply)(UserData.unapply)
        )
}

我是否遗漏了一些非常明显的东西?向正确的方向推进将非常感激

【问题讨论】:

    标签: forms scala playframework messages playframework-2.4


    【解决方案1】:

    我认为您可以从表单中删除第二个参数列表,因为您不会在任何地方使用参数messages。这将解决您的编译错误。

    @(form: Form[UserData])(implicit messages: Messages)
    

    可以

    @(form: Form[UserData])
    

    如果您打算计划使用国际化消息,则应在调用视图的范围内提供implicit val messages = ...。执行此操作的正常方法是将您的消息放入外部文件 conf/messages 并将 I18nSupport 混合到您的控制器中,这将提供隐式消息值作为 described here

    【讨论】:

    • 感谢您的帮助。我最初在我的视图(或其他任何地方)中没有该声明,但我遇到了同样的错误,但对于以下行 @helper.inputText(form("age"))(和上面的行)。因此添加它。然而,这似乎只是将责任“转移”到控制器上
    • 不客气。我扩展了答案以提供有关如何获得 messages 值的更多信息。如果仍然无法解决,请告诉我。
    • 必须做更多的提升才能让它工作。我需要一个无参数构造函数,以便解决方案在运行时工作。所以我需要从javax.inject._ 中添加@Inject() 注释。我确定我以前没有运气尝试过。不过,考虑到我在这里问,我一定是搞砸了。无论如何,你在正确的方向上给了我很大的推动力,所以将其标记为答案。再次感谢:)
    【解决方案2】:

    你的模板需要两个参数列表

    @(form: Form[UserData])(implicit messages: Messages) 
    

    但您只传递了 userData (formWithErrors) 表单

    formWithErrors => BadRequest(views.html.contact.index(formWithErrors))
    

    您需要手动传递消息

    formWithErrors => BadRequest(views.html.contact.index(formWithErrors)(message))
    

    或 将消息声明为范围内的隐式变量为

    implicit val message: Message = ...
    

    【讨论】:

    • 感谢您的建议。我想我应该对控制器方面更清楚一些。我的问题是如何定义一个有效的Message,但在进一步打扰您之前,我会先查看一下文档;)事实上,我或许应该首先这样做......
    猜你喜欢
    • 2016-11-08
    • 2018-01-06
    • 2016-09-19
    • 2015-08-28
    • 2017-02-02
    • 2016-01-17
    • 2011-10-17
    • 2016-03-31
    • 2015-01-27
    相关资源
    最近更新 更多