2012-03-17 16 views
27

Mój kod w Scala Szablon:przypadek mecz w szablonie scala nie działa, w PLAY2

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

Ale case ... być wyświetlane bezpośrednio do wygenerowanej strony html:

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

aw generowane .template.scala, to:

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

Ale widzę w dokumencie, należy wspierać 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

Wreszcie znalazłem sposób do pracy:

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

Ale wygląda tak skomplikowane.

Update2

Znajdź inny proste rozwiązanie:

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

Ale to nie działa dobrze w przypadku złożonego:

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

@routes.Users.logout nie zostaną zamienione.

UPDATE3

To getOrElse rozwiązanie:

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

To działa, ale nie używa match case

+0

Co się stanie, jeśli zamkniesz odpowiednią część walizek w nawiasach? Na przykład.'case Some (_) => {" xx "}' –

+0

Dzięki, ale to nie działa – Freewind

Odpowiedz

47

byłem uderzanie ten sam problem. Zamknięcie prawej części obudowy w nawiasach klamrowych naprawiło problem dla mnie.

Działa to dla mnie:

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

Bez szelek, dało błąd z przestrzenią po {na linii modelowej podświetlona. "oczekiwano" case ", ale znaleziono identyfikator."

ja też daje mi ten błąd, gdy próbuję umieścić @ przed otwarciem nawias klamrowy jak ten:

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

Uwaga: wymyślne użycie spacji i \ n do sformatowania kodu może również wywołać ten sam błąd, z którym miałem problem z czymś podobnym do \ @users match { case Some (users) => {\ n @ for (\ n user <- users \ n) {\ n \ @ user.name \ n} \ n} case Brak => {Brak użytkowników} } – ilmirons

0

znalazłem sposób, aby rozwiązać:

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

chodzi o to, aby Zwróć ciąg, a następnie za pomocą metody Html, aby go przekonwertować.