2012-03-17 9 views
27

Mi código en la plantilla Scala:caso de coincidencia en la plantilla Scala no funciona, en play2

@session.get("user.id") match { 
    case Some(_) => "xx" 
    case _ => "yy" 
} 
<a href="">Logout</a> 

Pero el case ... se mostrará directamente a la página HTML generada:

match { case Some(_) => "xx" case _ => "yy" } Logout 

y en el .template.scala generada, es:

""" 
<body> 
"""),_display_(Seq(/*11.4*/session/*11.11*/.get("user.id"))),format.raw/*11.26*/(""" match """),format.raw("""{"""),format.raw/*11.34*/(""" 
    case Some(_) => "xx" 
    case _ => "yy" 
"""),format.raw("""}"""),format.raw/*14.4*/(""" 
<a href="">Logout</a> 
""" 

pero veo en el documento, se debe apoyar la match case: https://github.com/playframework/Play20/wiki/ScalaTemplates

@connected match { 

    case models.Admin(name) => { 
    <span class="admin">Connected as admin (@name)</span> 
    } 

    case models.User(name) => { 
    <span>Connected as @name</span> 
    } 

} 

Update1

Por último, he encontrado una manera de trabajar:

@defining(session.get("user.id")) { x => 
    @x match { 
     case Some(_) => { "xx" } 
     case None => {"yy"} 
    } 
} 

pero se ve tan complicado.

Update2

encontrar otra solución sencilla:

@{session.get("user.id") match { 
    case Some(_) => "xx" 
    case _ => "yy" 
}} 

Pero no funciona bien en el caso complejo:

@{session.get("user.id") match { 
    case Some(_) => {<a href="@routes.Users.logout">Logout</a>} 
    case _ => "yy" 
}} 

El @routes.Users.logout no serán convertidos.

Update3

Esta es una solución getOrElse:

@session.get("user.id").map { _ => 
    <a href="@routes.Users.logout">Logout</a> 
}.getOrElse { 
    Not logged 
} 

Funciona pero no utiliza match case

+0

¿Qué pasa si encierra la parte correcta de los casos entre paréntesis? P.ej.'case Some (_) => {" xx "}' –

+0

Gracias, pero eso no funciona – Freewind

Respuesta

47

me estaba pegando el mismo problema. Encerrar la parte correcta de la caja con llaves me arregló el problema.

Esto funciona para mí:

@user match { 
    case Some(user) => { Welcome, @user.username! } 
    case None => { <a href="@routes.Application.login">Login</a> } 
} 

Sin las llaves, se dio un error en el espacio después del {en la línea de coincidencia resaltada. "'caso' esperado pero identificador encontrado".

También me da ese error si trato de poner @ antes de la llave de apertura de esta manera:

//This gives me the same error 
@user match { 
    case Some(user) => @{ "Welcome, " + user.username + "!" } 
    case None => { <a href="@routes.Application.login">Login</a> } 
} 
+0

Nota: los usos sofisticados de espacios y \ n para formatear el código también pueden desencadenar el mismo error que tuve problemas con algo similar a \ @usuarios coinciden con el caso { Algunos (usuarios) => {\ n @for (\ n usuario <- usuarios \ n) {\ n \ @ nombreusuario \ n} \ n} caso Ninguno => {No usuarios} } – ilmirons

0

he encontrado una manera de resolver:

 <div class="col-md-9"> 
     @{ 
      articles collect { 
      case (title,time,shortcontent) => { 
      Html(s""" 
       <div class="blog-post"> 
        <h2 class="blog-post-title"> $title </h2> 
        <p class="blog-post-meta"> $time </p> 
        <p> $shortcontent </p> 
        <hr/> 
       </div> 
      """) 
      } 
     } 
     } 
    </div> 

la idea es devuelve una cadena y luego usa un método Html para convertirla.

Cuestiones relacionadas