2012-03-20 3 views
32

Я пытаюсь сделать маршрут к определенному статическому файлу, но все, что я пытаюсь, заканчивается ошибкой.Маршрут к статическому файлу в 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")"> 

Все из них e методы были найдены в официальной документации и/или потоках здесь, в stackoverflow. Что мне здесь не хватает?

Спасибо.

+1

Я думаю, что третья ошибка возникает там, где первый пример публичной маршрутизации упоминается в шаблонах по умолчанию. У меня такая же проблема. Я ожидаю, что статическая ссылка вы/я пытаюсь добавить беспорядок вверх по обратной маршрутизации. – flurdy

+0

Что? два года, и нет принятого ответа. Эта проблема была решена еще? – Jus12

+0

@ Jus12 Извините, я просто не продолжал использовать игру (не по своему усмотрению, и это несчастливо), и я не знаю, какой ответ правильный. Тот, у кого больше всего голосов, тогда не решал проблему (как поясняет мой комментарий). Если кто-то сообщит мне, если какой-либо ответ будет правильным, я с радостью помету его как принятый. –

ответ

18

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")"> 

Я говорю о вашей третьей попытки

Кроме того, следить за доп/

EDIT

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

Если предположить, что ресурс находится в /public/stylesheets/main.css

+2

Это просто разрешает другую ошибку, но то, что вы изменили, не является проблема, когда я прокомментирую эту линию маршрутизации, все работает хорошо (за исключением того, что файл не обслуживается). Ошибка в третьей попытке относится к основному файлу шаблона, и это именно то, что я получил от команды _play new app-name_, я ее не изменил, и, как я писал, он работает без этой маршрутизации. –

3

я испытывал тот же вопрос, в то время как я пытался настроить некоторые дополнительные CSS. Он работал с этим синтаксисом в файле «маршрутов»

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

такой же, как один выше, он работает, но мы не можем понять, почему – BlueSky

4

У меня такая же проблема. Я последовал совету @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)) 

Я знаю, что это не ответ, но, возможно, это позволит кому-то подключиться к нему.

+0

Спасибо за ответ, у меня не было возможности попробовать это до сих пор, я надеюсь, вернусь к нему и отчитаюсь. –

+2

Правильный маршрут: «GET /favicon.ico controllers.Assets.at (path ="/public ", file =" images/favicon.ico ")" – AlexV

13

Я не совсем уверен, если это правильно, но это то, что мы используем, чтобы отобразить общую папку, содержащую наши изображения, сценарии ... и т.д ..

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

Спасибо за ответ, у меня не было возможности попробовать это до сих пор, я надеюсь, вернусь к нему и отчитаюсь. –

+0

Если я переименую «общедоступную» папку как «активы», это, похоже, не сработает (используя «путь =»/assets », ...). Любая идея почему? –

+0

Это работает для меня на Play 2.5, и это странно – BlueSky

13

Эта способность до сих пор не был добавлен, как я знаю. Но если кому-то нужен ответ, как вариант, вспомогательный контроллер может быть создан для этих целей:

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") 
1

Я столкнулся с той же проблемой. Когда я добавил второй controllers.Assets.at маршрутам, как

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

по умолчанию @routes.Assets.at вызовы в main.scala.html не удалось компиляции

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")" 

К сожалению, если вернуться к тому, линии только один активов в маршрутах, вам придется изменить в форму однопараметрической, чтобы избежать ошибок компиляции. Кажется, это ошибка.

10

Решение, которое является самым чистым, заключается в создании собственного AssetsBuilder, который будет создавать вашу статическую страницу.

Создайте этот файл в пакете контроллеров - Static.scala

package controllers 

object Static extends AssetsBuilder 

Тогда в маршрутах вы можете определить статическую конечную точку

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

Done. Теперь файл на /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 и т.д.

+1

проверено и сработало! +1 – Jus12

+1

это хороший трюк! +1 –

5

Ваша третья попытка была почти права. Вместо

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") 

Это решение было работы для меня. Надеюсь, это сработает и для вас, и для других.

1

Загрузите общую папку java-пакетов в файл jar, и это будет проблемой, если вы хотите обслуживать статический файл, который разрешает абсолютное местоположение файла на сервере. Правильный способ сделать это - иметь собственный контроллер и использовать его для обслуживания статического файла.

Для бывших, чтобы служить файл «mystatic.html», который находится в

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

Вы бы настроить этот маршрут в файле маршрутов.

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(); 
     } 
    } 
}