0

想象一下,我有一个这样的案例类:

   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(当前是 type Option[BSONObjectID])获取到 a string- 所以只是BSONObjectID字符作为 a string。我一直在尝试声明此处记录的可重用值,但我似乎无法做到正确。通常我会使用,但这在模板中没有按预期工作。谢谢你的帮助!flatMap


从这里开始,现在似乎我应该按照@marcospereira 的建议在案例类中使用一个方法。但是,我对正则表达式中的语法有点卡住(不足为奇!)。所以我正在尝试制作这样的字符串 - BSONObjectID("59654f33b17946eac2323b3e")be just 59654f33b17946eac2323b3e. 这就是我所拥有的:

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

但这也会返回引号,例如"59654f33b17946eac2323b3e". 如前所述,我不想要那些-感谢任何可以帮助解决此问题的人,因为我无法完全正确地使用语法。

4

2 回答 2

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. 你也可以有一个像这样的“视图助手”:

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>

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

于 2017-07-25T13:47:21.400 回答
1

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

通过将执行此操作的方法(如@marcospereira [upvote] 所建议的)添加到案例类来完成获取@team._id(当前为 type Option[BSONObjectID]) 。string但是我仍然对如何执行此操作有疑问,例如使用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>
      }

   ...

之后总是看起来很明显!

于 2017-07-28T10:35:33.343 回答