2013-11-23 4 views
6

Da sind meine Routen. Der zweite ist kommentiert.Spiel-Framework. Routen. Fehler: "nicht genug Argumente für Methode bei ..."

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

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

(Was ich will, ist: zu meinen HTML-Dateien zu machen, die in "/public/partials" Ordnern befinden über das Web, die gleiche Art und Weise verfügbar zu sein, wie es für assets gemacht hat)

Sobald I uncomment 2. Zeile - wird es Fehlermeldungen erhalten aufgrund dieser Linie (aus meiner index.scala.html):

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

Fehler ist wie hier:

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

F: Was ist los?

UPDATE:

anderen Worten: Ich möchte meine url kürzer machen, indem diese Zuordnung bereitstellt. Ansonsten muss ich diese URL verwenden: 'assets/partials/welcome.html' anstelle von der (die ich gerne verwenden würde): 'partials/welcome.html'.

Nur ein weiteres Mapping, das meine URLs kürzer machen würde.

Es macht Sinn, wenn ich diejenigen von JS Teil erreichen muss, es ist wie zwei Anwendungen in einem (1.play eins, 2. js eins), dort auch Routings, zwei Wurzeln. Für JS one nehme ich an, dass ich bereits in/public (oder in Assets) bin - das ist ein root für die js app.

Und ich frage mich, warum es nicht funktioniert.

Antwort

10

Vom play docs:

Reverse-Routing für öffentliche Vermögen

Wie bei jedem Controller in der Routen-Datei abgebildet, ein Reverse-Controller wird in controllers.routes.Assets erstellt. Sie verwenden dies, um die zum Abrufen einer öffentlichen Ressource erforderliche URL umzukehren. Zum Beispiel, aus einer Vorlage:

<script src="/assets/javascripts/jquery.js"></script> 

Beachten Sie, dass wir nicht die ersten folder Parameter angeben, wenn wir die Strecke umkehren:

<script src="@routes.Assets.at("javascripts/jquery.js")"></script> 

Dies wird das folgende Ergebnis. Dies liegt daran, dass unsere routes-Datei eine einzelne Zuordnung für die Aktion "Assets.at" definiert, in der der Ordnerparameter festgelegt ist. Es muss also nicht explizit angegeben werden.

Wenn Sie jedoch zwei Zuordnungen für die Assets definieren.in Aktion, wie folgt aus:

GET /javascripts/*file  controllers.Assets.at(path="/public/javascripts", file) 
GET /images/*file    controllers.Assets.at(path="/public/images", file) 

Dann müssen Sie beiden Parameter angeben, wenn der Reverse-Router:

<script src="@routes.Assets.at("/public/javascripts", "jquery.js")"></script> 
<image src="@routes.Assets.at("/public/images", "logo.png")"> 

Jede statische HTML im öffentlichen/partials Verzeichnis würde öffentlich zugänglich sein/assets /partials/someHtml.html. Genau genommen brauchen Sie also nicht die/partials/* Datei-Route

+0

Ich weiß, aber ich möchte meine URL kürzer machen, indem Sie diese Zuordnung. Ansonsten muss ich diese URL verwenden: 'assets/partials/welcome.html' anstelle von 'partials/welcome.html'. Nur ein weiteres Mapping, das meine URLs kürzer machen würde. Es macht Sinn, wenn ich diese von JS-Part erreichen muss, es ist wie zwei Anwendungen in einem (1.play eins, 2. js eins), dort auch Routings, zwei Wurzeln. Für JS one nehme ich an, dass ich bereits in/public (oder in Assets) bin - das ist ein root für die js app. Und ich fragte mich, warum es nicht funktioniert. – ses

+1

Vielleicht ist Ihnen das schon klar, aber wenn Sie ein zweites Mapping für die Aktion Assets.at definieren, müssen Sie den Pfadparameter angeben, wenn Sie den Reverse-Router verwenden. Dies liegt daran, dass der Pfad jetzt mehrdeutig ist. Anstatt also @ routes.Assets.at ("stylesheets/main.css") zu verwenden, musst du @ routes.Assests.at ("/ public", "stylesheets/main.css") verwenden. – mantithetical

+0

Ja. Aha. Ich würde besser eine Routendefinition verwenden und würde "leiden" mit einem weiteren Wort in der URL, als würde jeder Asset-URL einen weiteren Parameter hinzufügen. – ses

Verwandte Themen