0

我创建了一个播放框架模块“Ean2BarcodePlayModule”,其中包括保存在“views.barcodePackage.tags”包中的这个模板“barcode.scala.html”:

@(ean: Long)
<img class="barcode" alt="@ean" src="@controllers.barcodePackage.BarcodeController.getBarcode(ean)" />

使用“activator publish-local”后,我在测试项目的“index.scala.html”模板中引用了它:

@(message: String)

@main("Welcome to Play") {

    @barcodePackage.tags.barcode(5010255079763L)

}

预期的结果是

<!-- Redacted for brevity -->
  <img class="barcode" alt="5010255079763" src="/barcodeRoutes/5010255079763">
<!-- Redacted for brevity -->

但实际结果是:

<!-- Redacted for brevity -->
  <img class="barcode" alt="5010255079763" src="Action(parser=BodyParser(anyContent))">
<!-- Redacted for brevity -->

正如将要指出的,控制器的操作方法方法的返回类型出现在源 URL 应该出现的位置,但我不明白为什么会发生这种情况或知道如何解决它。

该模块在“barcodePackage.routes”中包含这一行:

GET     /:ean   controllers.barcodePackage.BarcodeController.getBarcode(ean:Long)

同时,测试项目中的路由文件包含:

->      /barcodeRoutes              barcodePackage.Routes

这是模块控制器的代码:

package controllers.barcodePackage


import models.barcodePackage.Barcode
import play.api.mvc.{Action, Controller}
import play.api.libs.concurrent.Execution.Implicits._
import scala.util.{Failure, Success}

/**
 * Created by Brian_Kessler on 3/11/2015.
 */
object BarcodeController extends Controller
{
  def getBarcode(ean:Long) = Action.async{
      Barcode.renderImage(ean) map {
        case Success(imageData) => Ok(imageData).as(Barcode.mimeType)
        case Failure(error)     => BadRequest("Couldn't generate bar code. Error: " + error.getMessage)
    }
  }

}

笔记:

  1. 最重要的是,我希望看到模块功能按预期工作。

  2. 但我也更喜欢一种解决方案,它允许我在模块中成功指定路由,而不是被要求在包含模块的项目中单独转录它们。

4

2 回答 2

1

@controllers.net.nowhereatall.playforscala.barcodes.barcode(ean)那是因为,当模板由 play 渲染时,您通过说 调用此函数。

现在您已经指定了一条路线并将其绑定到您的controllers.net.nowhereatall.playforscala.barcodes.barcode(ean)函数。

将文件名更改barcode.routesbarcodes.routes

现在,假设您已经/想要将barcodes.routes子项目的文件集成到主项目中,如下所示,

->  /barcodes barcodes.routes

所以......现在,你需要改变一些事情。

  1. 将您的控制器移动barcodes到 package 下的子项目中controllers.barcodes
  2. 您应该使用Barcodes而不是barcodes对象名称(Scala 约定)。

因此,理想情况下,您的controllers.net.nowhereatall.playforscala.barcodes控制器应该在这里 - controllers.barcodes.Barcodes . But you can place it here -controllers.barcodes.net.nowhereatall.playforscala.Barcodes if you want, just add the part.net.nowhereatall.playforscala` 在以下代码的任何地方。

现在,更改您的路线barcodes.routes

GET     /:ean                          controllers.barcodes.Barcodes.barcode(ean:Long)

现在,您需要做的是使用反向路由器在您的旋转模板中指定此路由。

@(ean: Long)
<img class="barcode" alt="@ean" src="@controllers.barcodes.routes.Barcodes.barcode(ean)" />

现在,当 play by 重新处理 tempate 时@barcodes.tags.barcode(5010255079763L),此controllers.barcodes.routes.Barcode(ean)调用将由/barcodes/5010255079763反向路由器评估(因为您绑定了controllers.barcodes.Barcode(ean)to/路由)。

因此,您将在浏览器中获得的是,

<img class="barcode" alt="5010255079763" src="/barcodes/5010255079763" />

你甚至可以通过硬编码下面给出的路线来让它工作,

@(ean: Long)
<img class="barcode" alt="@ean" src="/barcodes/@ean" />
于 2015-03-12T16:09:25.213 回答
1

感谢 Sarvesh Kumar Singh,他的回应帮助我走上了正确的轨道,我明白了这一点。

所以,据我了解,问题不在于模板没有找到控制器,而是它调用了控制器中的方法,而不是控制器的反向路由器。

所以,我真正需要做的是调整模块的模板(所有其他更改可能都无关紧要)以确保它改为调用路由器。

对于我目前的游戏版本,这意味着将barcode.scala.html 更改为:

@(ean: Long)
<img class="barcode" alt="@ean" src="@controllers.barcodePackage.routes.BarcodeController.getBarcode(ean:Long)" />

请注意,源代码不是以“@routes”开头,而是“routes”位于包名称(“barcodePackage”)和控制器名称(“BarcodeController”)之间。

于 2015-03-13T13:15:58.940 回答