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

时间:2017-07-25 13:28:12

标签: scala templates playframework twirl

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

   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"。如上所述,我不想要那些 - 感谢任何可以帮助解决这个问题的人,因为我无法正确理解语法。

2 个答案:

答案 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>
      }

   ...

事后似乎总是很明显!

相关问题