Получить строку из объекта в шаблоне

Представьте, что у меня есть класс case:

   case class Team(_id: Option[BSONObjectID], name: String = "", city: String = "", country: String = "")

И я передаю это в свой шаблон (в Play 2.5/Scala/reactiveMongo 0.11.14) вот так:

   @(teams : Seq[models.Team])

   ...

      @for(team <- teams){
            <tr>
                <td>@team._id</td>
                <td>@team.name</td>
                <td>@team.city</td>
                <td>@team.country</td>
            </tr>
      }

   ...

Мне нужно преобразовать @team._id (который в настоящее время имеет тип Option[BSONObjectID]) в string, то есть только символы BSONObjectID в виде string. Я пытался объявить повторно используемые значения как задокументировано здесь, но я не могу понять это правильно. Обычно я бы использовал flatMap, но в шаблоне это не работает должным образом. Спасибо за любую помощь!


Исходя из этого, теперь кажется, что я должен использовать метод в классе case case, как предложил @marcospereira. Однако я немного застрял (что неудивительно!) в синтаксисе выражения регулярного выражения. Итак, я пытаюсь сделать такую ​​строку: BSONObjectID("59654f33b17946eac2323b3e") будет просто 59654f33b17946eac2323b3e. Вот что у меня есть:

def idAsString = _id.flatMap(bson => """\".*?(")""".r.findFirstIn(bson.toString)).getOrElse("")

Но это также возвращает кавычки, например. "59654f33b17946eac2323b3e". Как уже упоминалось, мне они не нужны - спасибо всем, кто может помочь с этим, поскольку я не могу правильно понять синтаксис.


person jesus g_force Harris    schedule 25.07.2017    source источник


Ответы (2)


Вы можете сделать что-то вроде:

case class Team(_id: Option[BSONObjectID] = None, name: String = "", city: String = "", country: String = "") {

    def idAsString(): String = _id.getOrElse("")

}

А потом:

<td>@team.idAsString()</td>

Обратите внимание, что я добавил None по умолчанию для _id. У вас также может быть «помощник просмотра», например:

package helpers

object OptionViewHelpers {
  def optionValueToString(o: Option[_]): String = o match {
    case Some(v) => String.valueOf(v)
    case _ => ""
  }
}

И ваш взгляд:

@import helpers._

<td>@{OptionViewHelpers.optionValueToString(team._id)}</td>

Преимущество здесь в том, что вы можете повторно использовать его в других сценариях.

person marcospereira    schedule 25.07.2017
comment
Спасибо. Конечно, это возвращает строку, такую ​​​​как BSONObjectID("59654f33b17946eac2323b3e"), но я ищу только часть 59654f33b17946eac2323b3e. поэтому я сейчас изменяю метод idAsString(). Теперь я отредактирую свой первоначальный вопрос, так как я думаю, что BSONObjectID не может быть сопоставлено (поэтому flatMap не работает), и поэтому нам нужно преобразовать в string, а затем получить часть этой строки - это позор. - person jesus g_force Harris; 25.07.2017
comment
Ваша методология в первой части была правильной, поэтому я проголосовал - спасибо! - person jesus g_force Harris; 28.07.2017

Итак, это полный ответ (по крайней мере, для меня).

Преобразование @team._id (который в настоящее время имеет тип Option[BSONObjectID]) в string выполняется путем добавления метода, который делает это (как предложено @marcospereira [upvote]) в класс case. Но у меня все еще были проблемы с тем, как это сделать, например. используя regex, .split и т. д. Я считаю, что это самый простой способ:

   case class Team(_id: Option[BSONObjectID] = None, name: String = "", city: String = "", country: String = "") {

       def idAsString = _id.map(_.stringify).getOrElse("")

   }

Итак, теперь я могу вызвать этот метод в шаблоне, чтобы преобразовать Option[BSONObjectID] в string следующим образом:

   @(teams : Seq[models.Team])

   ...

      @for(team <- teams){
            <tr>
                <td>@team.idAsString</td>
                <td>@team.name</td>
                <td>@team.city</td>
                <td>@team.country</td>
            </tr>
      }

   ...

После этого всегда кажется очевидным!

person jesus g_force Harris    schedule 28.07.2017