Dealing with Options in Scala Play Template

4.6k Views Asked by At

I am trying reference things of type option in my Scala Play template. I've been trying to use this resource: http://www.playframework.com/modules/scala-0.9/templates

This is how I am trying to reference a field in the case class:

@{optionalobject ?. field}

and it is not working, this is the error I am getting:

';' expected but '.' found.

I am unsure why I am getting this error.

5

There are 5 best solutions below

0
On BEST ANSWER
@optionalobject.map(o => o.field).getOrElse("default string if optionalobject is None")
2
On

Judging by your tags you are using a Play 2.x variant, but you are referencing documentation from a module meant for Play 1.x.

Assuming your types match, I believe what you are looking for is something like:

@optionalobject.getOrElse(field)
1
On

For slightly nicer formatting that can span many lines (if you need to):

@optionalObject match {
  case Some(o) => {
    @o.field
  }
  case None => {
    No field text/html/whatever
  }
}

Or if you don't want to display anything if the field isn't defined:

@for(o <- optionalObject) {
  @o.field
}
0
On

Another possibility is using map, syntax I prefer for mixing up with HTML

@pagination.next.map { next =>
  <a href="@Routes.paginated(next)">
    @HtmlFormat.escape("Next >>>")
  </a>
}
0
On

Sometimes it might be convenient to write a short helper when dealing with Option to declutter the template code:

  // Helper object is defined in some file Helper.scala
  object Helper {
    def maybeAttribute[T](attrName:String, maybeValue:Option[String]) = 
       maybeValue.fold("") { value => 
         Html(attrName + "=" + value).toString()
       }
  }

Then the template can use this helper method directly like

  // some view.scala.html file
  <div @Helper.maybeAttribute("id",maybeId)>
  </div>