特定の静的ファイルへのルートを作成しようとしていますが、試行するすべての操作でエラーが発生します。
私は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のスレッドにあります。ここで何が欠けていますか?
ありがとう。
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にあると仮定します
これが正しいかどうかは完全にはわかりませんが、これは、画像、JavaScriptなどを含むパブリックフォルダをマップするために使用しているものです。
# Map static resources from the /public folder to the /assets URL path
GET /assets/*file controllers.Assets.at(path="/public", file)
私が知っているように、この能力はまだ追加されていません。しかし、誰かが答えを必要とする場合、オプションとして、これらの目的のためにヘルパーコントローラを作成できます。
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")
これに対する最もクリーンな解決策は、静的ページを構築する独自の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
を提供します。
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")
この解決策は私にとってうまくいきました。それがあなたや他の人にもうまくいくことを願っています。
まったく同じ問題があります。私は@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))
私はこれが答えではないことを知っていますが、おそらく誰かが答えを見つけることができるでしょう。
追加のcssを構成しようとしたときに、同じ問題が発生していました。 「routes」ファイルでこの構文を使用しました
GET /css/*file controllers.Assets.at(path="/public/css", file)
同じ問題が発生しました。次のようなルートに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パラメーター形式に変更する必要があります。私にはバグのようです。
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();
}
}
}