2012-05-14 8 views
4

それぞれのリストには名前とURLハイパーリンクを作成するためのスラッグが含まれていますが、Play 2.0では何が慣用的な方法になりますかこのリストの各項目をリンク(またはその他のHTML)にレンダリングするためのテンプレートを作成し、そのリストをカンマのような文字で挿入しますか?例えばリストをHTMLにマッピングし、Play 2.0テンプレートの結果を挿入する

は、3 foobarsがあった場合、最終的な出力は次のようになります。

<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をエスケープし、それは私が望むものではありません。

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

答えて

1

私はPlayを使用していませんが、mkStringが問題のようです。これは、苦労して作成されたNodeSeqStringに変換し、その後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を検討する必要があると思います。。)

:この問題を回避するには

プレイAPI、しかし。 Debilskiの考えに基づいてあなたが脱出停止するHTMLヘルパーを使用することができるはず

+0

HTMLを投入することを意図していませんその部分がScalaコードではなくリテラル出力として解析されているため、NodeSeqに挿入します。少なくとも私はそうだと思います。時には伝えるのが難しい場合もあります。 – kes

+0

コードがうまくいかないのですか? – Debilski

+0

まだ試してみる機会がありませんでした。しかし、+1はNodeSeqを起動するためのものです(その可能性は考えていませんでした)。 – kes

2

...

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

これはうまくいくはずですが、 "@ foobar.name"という文字列がそのまま表示されます。不思議なことに、@ foobar.nameを{foobar.name}(@を除く)に変更すると動作します。バグでなければならない... – kes

1

私は作業バージョンを構築しました。しかし、悲しいことに私は余分なスペースを追加します。ではない大したことが、それはそこにある:

<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> 
0

私は他の回答の組み合わせを使用して、同様にプレイ2.3のためにこれを解決することができました:

@foobars.map{foobar => 
    <a href="@routes.Foobar.quux(foobar.slug)">@foobar.name</a> 
}.reduceLeftOption((e1: Html, e2: Html) => Html(e1 + "," + e2)) 
関連する問題