从模板中的对象中获取字符串
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>
}
...
事后总是很明显!
假设我有这样一个案例 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>
}
...
事后总是很明显!