【问题标题】:match case in scala template doesn't work, in play2scala模板中的匹配案例不起作用,在play2中
【发布时间】:2012-03-17 07:45:04
【问题描述】:

我在 scala 模板中的代码:

@session.get("user.id") match {
    case Some(_) => "xx"
    case _ => "yy"
}
<a href="">Logout</a>

但是case ...会直接显示到生成的html页面:

match { case Some(_) => "xx" case _ => "yy" }  Logout

而在生成的.template.scala中是:

"""
<body>
"""),_display_(Seq(/*11.4*/session/*11.11*/.get("user.id"))),format.raw/*11.26*/(""" match """),format.raw("""{"""),format.raw/*11.34*/("""
    case Some(_) => "xx"
    case _ => "yy"
"""),format.raw("""}"""),format.raw/*14.4*/("""
<a href="">Logout</a>
"""

但我在文档中看到,它应该支持match casehttps://github.com/playframework/Play20/wiki/ScalaTemplates

@connected match {

  case models.Admin(name) => {
    <span class="admin">Connected as admin (@name)</span>
  }

  case models.User(name) => {
    <span>Connected as @name</span>
  }

}

更新1

终于,我找到了工作的方法:

@defining(session.get("user.id")) { x =>
    @x match {
        case Some(_) => { "xx" }
        case None => {"yy"}
    }
}

但它看起来很复杂。

更新2

寻找另一个简单的解决方案:

@{session.get("user.id") match {
    case Some(_) => "xx"
    case _ => "yy"
}}

但在复杂情况下效果不佳:

@{session.get("user.id") match {
    case Some(_) => {<a href="@routes.Users.logout">Logout</a>}
    case _ => "yy"
}}

@routes.Users.logout 不会被转换。

UPDATE3

这是getOrElse 解决方案:

@session.get("user.id").map { _ =>
    <a href="@routes.Users.logout">Logout</a>
}.getOrElse {
    Not logged
}

它可以工作,但它不使用match case

【问题讨论】:

  • 如果你把case的右边部分放在括号里怎么办?例如。 case Some(_) =&gt; { "xx" }
  • 谢谢,但这不起作用

标签: templates playframework-2.0


【解决方案1】:

我遇到了同样的问题。将案例的右侧部分括在花括号中解决了我的问题。

这对我有用:

@user match {
    case Some(user) => { Welcome, @user.username! }
    case None => { <a href="@routes.Application.login">Login</a> }
}

如果没有大括号,它会在匹配行上的 { 后面的空格突出显示时出错。 “需要‘case’,但找到了标识符。”

如果我尝试像这样在左大括号前添加一个@,也会出现该错误:

//This gives me the same error
@user match {
    case Some(user) => @{ "Welcome, " + user.username + "!" }
    case None => { <a href="@routes.Application.login">Login</a> }
}

【讨论】:

  • 注意:花哨地使用空格和 \n 来格式化代码也可能触发同样的错误,我遇到了类似于 \@users match { case Some(users) => {\n @for (\n user { No users } }
【解决方案2】:

我找到了解决方法:

      <div class="col-md-9">
        @{
          articles collect { 
          case (title,time,shortcontent) => {
            Html(s"""
                <div class="blog-post">
                    <h2 class="blog-post-title"> $title </h2>
                    <p class="blog-post-meta"> $time </p>
                    <p> $shortcontent </p>
                    <hr/>
                </div>
             """)
            }
         }  
        }
    </div>  

这个想法是返回一个字符串,然后使用 Html 方法对其进行转换。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-25
    • 2017-03-21
    • 2013-09-13
    • 2017-02-25
    • 2023-03-11
    • 2015-04-27
    • 1970-01-01
    相关资源
    最近更新 更多