web-dev-qa-db-ja.com

Playの静的ファイルにルーティングします! 2.0

特定の静的ファイルへのルートを作成しようとしていますが、試行するすべての操作でエラーが発生します。

私は3つの異なる試みをしました:

1。

GET /file   staticFile:/public/html/file.html

私が得るエラー:

Compilation error
string matching regex `\z' expected but `:' found

2。

GET /file   controllers.Assets.at(path="/public/html", "file.html")

私が得るエラー:

Compilation error
Identifier expected

3。

GET /file   controllers.Assets.at(path="/public/html", file="file.html")

私が得るエラー:(そしてこれは最も奇妙です)

Compilation error
not enough arguments for method at: (path: String, file: String)play.api.mvc.Call. Unspecified value parameter file.

3番目のエラーの奇妙な部分は、次の行の別のファイル(app/views/main.scala.html)にスローされることです。

<link rel="stylesheet" media="screen" href="@routes.Assets.at("stylesheets/main.css")">

これらのメソッドはすべて、公式ドキュメントおよび/またはここのstackoverflowのスレッドにあります。ここで何が欠けていますか?

ありがとう。

32
Nitzan Tomer

IIRC、変更

<link rel="stylesheet" media="screen" href="@routes.Assets.at("stylesheets/main.css")">

<link rel="stylesheet" media="screen" href="@routes.Assets.at("stylesheets/", "main.css")">

私はあなたの3回目の試みについて話している

また、余分な/に注意してください

[〜#〜]編集[〜#〜]

GET /assets/main.css    controllers.Assets.at(path="/public", file="/stylesheets/main.css")

リソースが/public/stylesheets/main.cssにあると仮定します

18
Jamil

これが正しいかどうかは完全にはわかりませんが、これは、画像、JavaScriptなどを含むパブリックフォルダをマップするために使用しているものです。

# Map static resources from the /public folder to the /assets URL path
GET     /assets/*file               controllers.Assets.at(path="/public", file)
13
Nick

私が知っているように、この能力はまだ追加されていません。しかし、誰かが答えを必要とする場合、オプションとして、これらの目的のためにヘルパーコントローラを作成できます。

object StaticFile extends Controller {

  def html(file: String) = Action {
    var f = new File(file)

    if (f.exists())
      Ok(scala.io.Source.fromFile(f.getCanonicalPath()).mkString).as("text/html");
    else
      NotFound
  }

}

そしてルート設定に

GET     /               controllers.StaticFile.html(file = "public/index.html")
13
Andrey Antonov

これに対する最もクリーンな解決策は、静的ページを構築する独自のAssetsBuilderを作成することです。

このファイルをコントローラーパッケージに作成します-Static.scala

package controllers

object Static extends AssetsBuilder

次に、ルートで静的エンドポイントを定義できます

GET /file   controllers.Static.at(path="/public/html", "file.html")

できました。これで、/public/html/file.htmlのファイルがlocalhost:9000/fileから提供されます

上記のハードコードをより一般的なものに置き換えた場合:

GET /*file   controllers.Static.at(path="/public/html", *file + ".html")

その後、/foo/public/html/foo.htmlを提供し、/bar/public/html/bar.htmlを提供します。

10
Michael Allen

3回目の試みはほぼ正しかった。の代わりに

GET /file   controllers.Assets.at(path="/public/html", file="file.html")

このようにしてください

GET /file   controllers.Assets.at(path="/public", file="html/file.html")

以前に同じ問題が発生しました。ルートファイルは次のようになります。

# Application
GET /       controllers.Assets.at(path="/public/html", file="static.html")
GET /exmpl  controllers.Examples.index

# Resources
GET /assets/*file  controllers.Assets.at(path="/public", file)

そして私はビュー内の逆ルートを持っています(examples.scala.html

@routes.Assets.at("imagefolder")   #try to generate path to /public/imagefolder.

http://localhost:9000/exmplを開くと、このエラーが表示されました。

not enough arguments for method at: (path: String, file: String)play.api.mvc.Call. Unspecified value parameter file.

この問題を解決するために、私はこのルートを変更しました

GET /     controllers.Assets.at(path="/public/html", file="static.html")

これに

GET /     controllers.Assets.at(path="/public", file="html/static.html")

この解決策は私にとってうまくいきました。それがあなたや他の人にもうまくいくことを願っています。

5
user2737506

まったく同じ問題があります。私は@Jamilのアドバイスに従い、静的ファイル(私の場合はファビコン)でこれを機能させることができ、テンプレートをコンパイルすることはできましたが、実行時にビューを使用しようとすると新しいエラーが発生しました。以下の関連コード、

ルートへの変更(このルートは正しく解決されるようになりました)

GET     /favicon.ico                controllers.Assets.at(path="/public/images", file="favicon.png")

ビューに変更(コンパイル)

<link rel="stylesheet" media="screen" href="@routes.Assets.at("stylesheets/","main.css")">

新しいエラー(実行時のみ)

[MatchError: (stylesheets/,main.css) (of class scala.Tuple2)]

// @LINE:29
// @LINE:28
def at(path:String, file:String) = {
   (path, file) match {
// @LINE:28
case (path, file) if path == "/public" => Call("GET", "/assets/" + implicitly[PathBindable[String]].unbind("file", file))

私はこれが答えではないことを知っていますが、おそらく誰かが答えを見つけることができるでしょう。

4
Ben Boyter

追加のcssを構成しようとしたときに、同じ問題が発生していました。 「routes」ファイルでこの構文を使用しました

  GET   /css/*file                      controllers.Assets.at(path="/public/css", file)
3
loic23

同じ問題が発生しました。次のようなルートに2番目のcontrollers.Assets.atを追加したとき

GET  /assets/*file   controllers.Assets.at(path="/public", file)
GET  /assets2/*file  controllers.Assets.at(path="/public2", file)

main.scala.htmlのデフォルトの@routes.Assets.at呼び出しがコンパイルに失敗しました

Compilation error
not enough arguments for method at: (path: String, file: String)play.api.mvc.Call. Unspecified value parameter file.

これは、複数の一致するオブジェクトが存在する暗黙的なパラメータが原因であると思われます。解決策は、先行する位置パラメータを追加することです。

href="@routes.Assets.at("/public","/css/main.css")"

残念ながら、ルートのアセットラインを1つだけに戻す場合は、コンパイルエラーを回避するために、1パラメーター形式に変更する必要があります。私にはバグのようです。

1
Eric Drechsel

Play Javaパッケージパブリックフォルダーをjarファイルにパッケージ化します。これは、サーバーの絶対ファイルの場所に解決される静的ファイルを提供する場合に問題になります。正しい方法は独自のコントローラーを用意し、それを使用して静的ファイルを提供します。

たとえば、「mystatic.html」というファイルを

<your playhome>
    |-----<myfolder>
        |------mystatic.html

このルートは、routesファイルで構成します。

GET /mystatic           mypackage.mycontrollers.Static.getFile(path="/myfolder/mystatic.html")

コントローラーは次のように実装されます。

package mypackage.mycontroller;

import Java.io.File;
import com.google.inject.Inject;
import com.google.inject.Provider;

import play.Application;
import play.mvc.Controller;
import play.mvc.Result;
import play.mvc.Results;

public class Static extends Controller {

    @Inject
    Provider<Application> app;

    public Result getFile(String path){
        File file = app.get().getFile(path);
        if(file.exists()){
            return ok(file);            
        }else{
            return Results.notFound();
        }
    }   
}
1
Droidman