Play 2.0 templating - Scala `match` and `val` do not compile in a view template

pattern-matching, playframework-2.0, scala, template-engine

Solution

Using `match` expressions in templates

You need to enclose in braces (“{” and “}”) the HTML content of your templates:

@for(line <- content.toString.lines) {
  @line match {
    case "" => { }
    case _ => { <li>@Html(line)</li> }
  }
}

In your specific case, the following code would read better IMHO:

@content.toString.lines.collect {
  case line if !line.isEmpty => { <li>@Html(line)</li> }
}

Defining values

You can define values using the `defining[T](value: T)(usage: T => Html)` helper:

@defining(1 + 2 * 3) { value =>
  <div>@value</div>
}

Problem

I have the following code in Play 2.0 template: ``` @content.toString.lines.map{ case line => // i put `case` here as another attempt to make it work line match { case "" => @Html("") case _ => <li>@Html(line)</li> /*CRASH*/ } } ``` It fails on the marked line, saying that `not found: value line`. The second variant of it: ``` @for(line <- content.toString.lines){ @line match { /*CRASH*/ case "" => @Html("") case _ => <li>@Html(line)</li> } } ``` fails on the marked line, claiming that `'case' expected but identifier found`. UPDATE: Same thing goes for `val`: ``` @val headID = "head" ``` comes up with `illegal start of simple expression`. UPDATE ENDS I would like to know, what am I doing wrong and how to correctly implement the `match-case` structure and `val` assignment in Play's templates?

Original source