Route vers le fichier statique en jeu! 2,0
j'essaie de faire une route vers un fichier statique spécifique mais tout ce que j'essaie se termine par une erreur.
j'ai fait 3 tentatives différentes:
1.
GET /file staticFile:/public/html/file.html
L'erreur que j'obtiens:
Compilation error
string matching regex `z' expected but `:' found
2.
GET /file controllers.Assets.at(path="/public/html", "file.html")
L'erreur que j'obtiens:
Compilation error
Identifier expected
3.
GET /file controllers.Assets.at(path="/public/html", file="file.html")
L'erreur que j'obtient: (et c'est le plus bizarre)
Compilation error
not enough arguments for method at: (path: String, file: String)play.api.mvc.Call. Unspecified value parameter file.
la partie bizarre de la 3ème erreur est qu'elle est lancée dans un fichier différent (app / views / main.Scala.html) sur la ligne suivante:
<link rel="stylesheet" media="screen" href="@routes.Assets.at("stylesheets/main.css")">
toutes ces méthodes ont été trouvées dans la documentation officielle et/ou les threads ici sur stackoverflow. Ce qui me manque ici?
Merci.
9 réponses
IIRC, change
<link rel="stylesheet" media="screen" href="@routes.Assets.at("stylesheets/main.css")">
<link rel="stylesheet" media="screen" href="@routes.Assets.at("stylesheets/", "main.css")">
je suis en train de parler de votre troisième tentative
attention aussi aux extra/
EDIT
GET /assets/main.css controllers.Assets.at(path="/public", file="/stylesheets/main.css")
en supposant que votre ressource est at/public/stylesheets / main.css
Je ne suis pas totalement sûr que ce soit correct, mais c'est ce que nous utilisons pour cartographier un dossier public contenant nos images, javascripts... etc..
# Map static resources from the /public folder to the /assets URL path
GET /assets/*file controllers.Assets.at(path="/public", file)
cette capacité n'a pas encore été ajoutée, comme je le sais. Mais si quelqu'un a besoin de réponse, en option, le contrôleur helper peut être créé dans ce but:
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
}
}
et puis dans les routes config
GET / controllers.StaticFile.html(file = "public/index.html")
la solution la plus propre est de créer votre propre AssetsBuilder qui construira votre page statique.
Créez ce fichier dans votre paquet controllers - Static.scala
package controllers
object Static extends AssetsBuilder
puis dans vos routes vous pouvez définir votre point final statique
GET /file controllers.Static.at(path="/public/html", "file.html")
fait. Maintenant, le fichier /public/html/file.html
sera servi hors d' localhost:9000/file
si vous remplacez le code dur ci-dessus par un code plus générique:
GET /*file controllers.Static.at(path="/public/html", *file + ".html")
/foo
va servir /public/html/foo.html
,/bar
serviront /public/html/bar.html
etc.
Votre troisième tentative était presque droit. Au lieu de
GET /file controllers.Assets.at(path="/public/html", file="file.html")
le faire comme ceci
GET /file controllers.Assets.at(path="/public", file="html/file.html")
j'ai eu le même problème avant. Mon dossier d'itinéraire ressemble à ça.
# 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)
Et j'ai en dessous de route inverse à l'intérieur de vues (examples.scala.html
)
@routes.Assets.at("imagefolder") #try to generate path to /public/imagefolder.
Quand j'ouvre http://localhost:9000/exmpl
, cette erreur s'est manifestée.
not enough arguments for method at: (path: String, file: String)play.api.mvc.Call. Unspecified value parameter file.
Pour résoudre ce problème, je viens de modifier cet itinéraire
GET / controllers.Assets.at(path="/public/html", file="static.html")
pour ce
GET / controllers.Assets.at(path="/public", file="html/static.html")
Cette solution me convenait. J'espère que ça marchera pour vous et les autres aussi.
j'ai exactement le même problème. J'ai suivi les conseils de @Jamil et j'ai réussi à obtenir que cela fonctionne pour le fichier statique (dans mon cas un favicon) et j'ai réussi à obtenir les gabarits pour compiler mais j'ai obtenu une nouvelle erreur à l'exécution en essayant d'utiliser la vue. Code pertinent ci-dessous,
Changement du tracé (cette route maintenant résolu correctement)
GET /favicon.ico controllers.Assets.at(path="/public/images", file="favicon.png")
Modifier la vue (compile)
<link rel="stylesheet" media="screen" href="@routes.Assets.at("stylesheets/","main.css")">
Nouveau message d'erreur (uniquement au moment de l'exécution)
[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))
je sais que c' n'est pas une réponse, mais peut-être que cela permettra à quelqu'un de conduite avec un.
j'éprouvais le même problème pendant que j'essayais de configurer des css supplémentaires. Il a fonctionné avec cette syntaxe dans le fichier" routes"
GET /css/*file controllers.Assets.at(path="/public/css", file)
j'ai rencontré le même problème. Quand j'ai ajouté un deuxième controllers.Assets.at
pour les routes, comme
GET /assets/*file controllers.Assets.at(path="/public", file)
GET /assets2/*file controllers.Assets.at(path="/public2", file)
par défaut @routes.Assets.at
appels principaux.Scala.échec de la compilation html
Compilation error
not enough arguments for method at: (path: String, file: String)play.api.mvc.Call. Unspecified value parameter file.
cela semble être dû à un paramètre implicite pour lequel il y a plusieurs objets correspondants. La solution est d'ajouter un paramètre de position principal:
href="@routes.Assets.at("/public","/css/main.css")"
malheureusement, si vous retournez à n'avoir qu'une seule ligne d'actifs dans les routes, vous devrez passer à la forme à un paramètre pour éviter une erreur de compilation. Semble être un bug pour moi.
lire le dossier public des paquets java dans un fichier jar et ce serait un problème si vous souhaitez servir un fichier statique qui se résout à un emplacement de fichier absolu dans le serveur. La bonne façon de le faire est d'avoir votre propre contrôleur et de l'utiliser pour servir les fichiers statiques.
par exemple, pour servir un fichier " mystatic.html" qui est dans le
<your playhome>
|-----<myfolder>
|------mystatic.html
vous configureriez cette route dans votre fichier de routes.
GET /mystatic mypackage.mycontrollers.Static.getFile(path="/myfolder/mystatic.html")
et votre controller serait implémenté comme suivre.
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();
}
}
}