从模板中的对象中获取字符串

Get a string from an object in the template

假设我有这样一个案例 class:

   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。我一直在尝试声明 可重复使用的值 所记录的 here 但我似乎无法做到正确。通常我会使用 flatMap 但这在模板中没有按预期工作。感谢您的帮助!


从这里开始,现在看来我应该按照@marcospereira 的建议在 case case class 中使用一种方法。但是,我对正则表达式中的语法有点困惑(毫不奇怪!)。所以我试图制作这样的字符串 - BSONObjectID("59654f33b17946eac2323b3e") 只是 59654f33b17946eac2323b3e。这是我的:

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

但这也是 returns 引号,例如"59654f33b17946eac2323b3e"。如前所述,我不想要那些 - 感谢任何可以帮助解决这个问题的人,因为我不太了解正确的语法。

你可以这样做:

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

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

}

然后:

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

请注意,我已将 None 添加为 _id 的默认设置。你也可以有这样的 "view helper":

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>

这里的好处是你可以在其他场景中复用它。

好的,这就是完整的答案(至少对我而言)。

@team._id(当前类型为 Option[BSONObjectID])添加到 string 是通过向案例class。但是我仍然对如何执行此操作有疑问,例如使用 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>
      }

   ...

事后总是很明显!