4

foob​​ars のリスト (それぞれに名前と、URL ハイパーリンクを作成するために使用されるスラッグが含まれています) が与えられた場合、Play 2.0 テンプレートでこのリスト内の各アイテムをリンク (または他の HTML) にレンダリングするための慣用的な方法は何でしょうか? )、次にリストにコンマなどの文字を挿入しますか?

たとえば、foobar が 3 つある場合、最終的な出力は次のようになります。

<a href="/quux/foobar1">Foobar1</a>, <a href="/quux/foobar2">Foobar2</a>, <a href="/quux/foobar3">Foobar3</a>

私の最初の衝動は試してみることでした:

@foobars.map{foobar => 
<a href="@routes.Foobars.quux(foobar.slug)">@foobar.name</a>
}.mkString(", ")

しかし、これはエスケープされたHTMLを出力します。これは私が望むものではありません。

これは一般的な使用例のようです。それを達成できる慣用的な方法はありますか?

4

4 に答える 4

2

Htmlヘルパーを使用してエスケープを停止できるはずです...

@{Html(foobars.map{foobar => 
    <a href="@routes.Foobars.quux(foobar.slug)">@foobar.name</a>
}.mkString(", "))}
于 2012-07-31T14:36:15.297 に答える
1

私は Play を使っていませんが、それが問題だと思いますmkString。苦労して構築NodeSeqしたStringを に変換し、Play の HTML 出力ルーチンに渡して に変換しますText(エスケープを含みます)。

これを回避するには:

@foobars.map{foobar => 
  <a href="@routes.Foobars.quux(foobar.slug)">@foobar.name</a>
}.reduceLeft((e1: xml.NodeSeq, e2: xml.NodeSeq) => e1 ++ xml.Text(", ") ++ e2)

(これは foobar の空のシーケンスでは失敗します。その場合は調べる必要がありますreduceLeftOption。)

ただし、Play API にはこれ専用の関数があるかもしれません。

于 2012-05-14T08:56:14.363 に答える
1

Debilski のアイデアに基づいて、動作するバージョンを作成しました。しかし悲しいことに、追加するときに余分なスペースができます。大したことではありませんが、そこにあります:

<td>
    @r.countries.map{ country =>
      <a href="@routes.Items.editCountry(country.toString, "main")">
         @Country.findOneByID(country).map(_.name)
      </a>
    }.reduceLeftOption((e1: Html, e2: Html) => e1 += Html(",") += e2)
</td>
于 2014-03-19T21:03:06.423 に答える
0

他の回答を組み合わせて、Play 2.3 でもこれを解決できました。

@foobars.map{foobar =>
    <a href="@routes.Foobar.quux(foobar.slug)">@foobar.name</a>
}.reduceLeftOption((e1: Html, e2: Html) => Html(e1 + "," + e2))
于 2014-11-06T15:10:23.317 に答える