2013-11-23 8 views
6

Ci sono i miei percorsi. Il secondo è commentato.Play Framework. Itinerari. Errore: "argomenti non sufficienti per il metodo in ..."

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

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

(Quello che voglio è: a fare il mio file html che si trovano all'interno della cartella "/public/partials" siano disponibili attraverso il web, così come è fatto per assets)

Appena I decommentare 2a linea - otterrà errori dovuti a questa linea (dal mio index.scala.html):

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

errore è come qui:

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

D: Cosa c'è che non va?

UPDATE:

Un'altra parole: Voglio fare il mio URL più breve prevedendo che la mappatura. Altrimenti devo usare questo url: 'assets/partials/welcome.html' invece di quello (che vorrei usare): 'partials/welcome.html'.

Solo un'altra mappatura che renderebbe i miei url più brevi.

Ha senso quando ho bisogno di raggiungere quelli dalla parte JS, è come avere due applicazioni in una (1.play one, 2. js one), anche lì routing, due radici. Per JS presumo di essere già in/pubblico (o in risorse) - questa è una radice per l'app js.

E mi chiedo perché non funziona.

risposta

10

Dal play docs:

di routing inverso per i beni pubblici

Per quanto riguarda qualsiasi controller mappato nel file di percorsi, un controller inverso viene creato in controllers.routes.Assets. Lo usi per invertire l'URL necessario per recuperare una risorsa pubblica. Ad esempio, da un modello:

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

Questo produrrà il seguente risultato:

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

Si noti che non si specifica il primo parametro folder quando invertiamo la rotta. Questo perché il nostro file di rotte definisce una singola mappatura per l'azione Assets.at, in cui il parametro della cartella è fisso. Quindi non ha bisogno di essere specificato esplicitamente.

Tuttavia, se si definiscono due mapping per le risorse.in azione, in questo modo:

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

Poi sarà necessario specificare entrambi i parametri quando si utilizza il router inverso:

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

Qualsiasi html statico nella directory pubbliche/parziali sarebbero a disposizione del pubblico a/attività /partials/someHtml.html. Quindi a rigor di termini, non è necessario l'/ parziali/* percorso del file

+0

lo so, ma voglio fare il mio url più breve prevedendo che la mappatura. Altrimenti devo usare questo URL: 'attività/parziali/welcome.html' invece di quello: 'partial/welcome.html'. Solo un'altra mappatura che renderebbe i miei url più brevi. E ha senso quando ho bisogno di raggiungere coloro da JS parte, è come avere due applicazioni in una sola (1.play uno, 2. js uno), anche lì itinerari, due radici. Per JS quella che sto supponendo che io sono già a/pubblica (o in attività) - questa è una radice per un'applicazione js. E mi sono chiesto perché non funziona. – ses

+1

Forse questo è già chiaro a voi, ma se si definisce una seconda mappatura per l'azione Assets.at allora avete bisogno di specificare il parametro di percorso quando si utilizza il router inverso. Questo perché il percorso è ora ambiguo. Quindi, invece di essere in grado di usare @ routes.Assets.at ("stylesheets/main.css") devi usare @ routes.Assets.at ("/ public", "stylesheets/main.css") – mantithetical

+0

Sì. Io vedo. Farei meglio ad usare una definizione di rotta e 'soffrire' di avere una parola in più in url che mettere un altro parametro in ogni URL di risorsa. – ses

Problemi correlati