想象一下,我有一个类似的案例类:
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建议的方法。但是我对正则表达式中的语法有点卡住(不足为奇!)。所以我想创建一个这样的字符串 - BSONObjectID("59654f33b17946eac2323b3e")
只是59654f33b17946eac2323b3e
。这就是我所拥有的:
def idAsString = _id.flatMap(bson => """\".*?(")""".r.findFirstIn(bson.toString)).getOrElse("")
但这也会返回引号,例如: "59654f33b17946eac2323b3e"
。如上所述,我不想要那些 - 感谢任何可以帮助解决这个问题的人,因为我无法正确理解语法。
答案 0 :(得分:1)
您可以执行以下操作:
case class Team(_id: Option[BSONObjectID] = None, name: String = "", city: String = "", country: String = "") {
def idAsString(): String = _id.getOrElse("")
}
然后:
<td>@team.idAsString()</td>
请注意,我已将None
添加为_id
的默认值。您还可以拥有一个&#34;查看助手&#34;像这样:
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>
这里的优点是您可以在其他场景中重复使用它。
答案 1 :(得分:1)
好的,这就是总答案(至少对我而言)。
将@team._id
(当前类型为Option[BSONObjectID]
)提升为string
是通过添加一个方法来完成此操作(由@marcospereira [upvote]建议)到案例类。但我仍然有关于如何做到这一点的问题,例如使用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>
}
...
事后似乎总是很明显!