0

「views.barcodePackage.tags」パッケージに保存されたこのテンプレート「barcode.scala.html」を含む Play Framework モジュール「Ean2BarcodePlayModule」を作成しました。

@(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.routesますbarcodes.routes

barcodes.routesここで、次のようにサブプロジェクトのファイルをメインプロジェクトに統合した/統合したいと仮定すると、

->  /barcodes barcodes.routes

だから...今、あなたはいくつかのことを変える必要があります。

  1. barcodespackage の下のサブプロジェクトにコントローラーを移動しますcontrollers.barcodes
  2. オブジェクト名には andを使用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)

ここで行う必要があるのは、リバース ルーターを使用して、twirl テンプレートでこのルートを指定することです。

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

ここで、tempate が play by によってリアンダーされる@barcodes.tags.barcode(5010255079763L)と、このcontrollers.barcodes.routes.Barcode(ean)呼び出しはリバース ルーターによって評価されます (をroute/barcodes/5010255079763にバインドしたため)。controllers.barcodes.Barcode(ean)/

したがって、ブラウザに表示されるのは、

<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 のおかげで、私は正しい軌道に乗ることができました。

したがって、私が理解したように、問題はテンプレートがコントローラーを見つけられなかったことではなく、コントローラーのリバースルーターではなくコントローラーでメソッドを呼び出していたことでした。

そのため、モジュールのテンプレートを微調整して (他のすべての変更はおそらく無関係でした)、代わりにルーターを呼び出すようにする必要がありました。

私の現在のバージョンの play では、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 に答える