web-dev-qa-db-ja.com

マッチケースscalaテンプレートが機能しない、play2で

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 caseをサポートしているはずです: https://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>
  }

}

UPDATE1

最後に、私は働く方法を見つけました:

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

しかし、それはとても複雑に見えます。

UPDATE2

別の簡単な解決策を見つける:

@{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を使用しません

31
Freewind

私は同じ問題にぶつかっていました。ケースの右側を中括弧で囲むと、問題が解決しました。

これは私のために働きます:

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

中かっこがないと、一致行の{の後のスペースが強調表示されてエラーが発生しました。 「「ケース」が必要ですが、識別子が見つかりました。」

また、次のように最初の中括弧の前に@を付けようとすると、エラーが発生します。

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

私は解決する方法を見つけました:

      <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メソッドを使用して変換するという考え方です。

1
fairjm