13

表示したい URL/タイトル ペアの値のリストがあります。(より具体的には、各オブジェクトには独自のリンクのリストがあり、0 のもの、1 のもの、それ以上のものがあります。) コンマで区切られたリストにそれらを表示したいと思います。だから私はこれを私の.erbファイルに書きました:

<%= links.map{|wl| link_to wl.title, wl.url}.join(', ') %>

少し驚いたことに、作成したいリンクの HTML コードのコンマ区切りリストが表示されました。つまり、すべての山かっこをアンパサンドでエンコードしていました。高階関数におかしな点がないことを確認するために、より命令的なバージョンを試しました。

<% a = [] %>
<% links.each do |wl| %>
  <% a << link_to(wl.title, wl.url) %>
<% end %>
<%= a.join(', ') %>

もちろん、同じ結果です。link_toしかし、私は を誤用しているとは思いません。

<% links.each do |wl| %>
  <%= link_to(wl.title, wl.url) %>,
<% end %>

次に、実際にリンクを作成します。最後のコンマの後に余分なコンマがあることを除いて、それは私が望むものとほぼ同じです。link_to出力がどこに向かっているかに応じて異なる動作をさせる魔法が内部で行われていますか? その魔法を回避する方法はありますか?セマンティクスはまさに私がここjoinで求めているものであり、(each_index を使用して、おそらく) 自分でロールする方法を理解することはできますが、一般的な問題であるに違いないものに対する非常に重く、Ruby 以外のソリューションのように思えます。

4

6 に答える 6

18

区切り文字列safe_joinと組み合わせて使用​​します。html_safe

例:

<%= safe_join(links.map { |l| link_to(l.title, l.url) }, ", ".html_safe) %>
于 2015-09-25T03:28:18.427 に答える
6

使用する提案によって目的html_safeの結果が得られますが、そのようなループをビューに貼り付けないことをお勧めします。あなたが探していることをするための完全に良い方法がレールにあります:

現在ループを持っているメインビューファイルで、これを次のように変更します。

<%= render partial: 'links/link', collection: links, spacer_template: 'shared/comma' %>

次に、パーシャルを作成しますlinks/_link.html.erb

<%= link_to link.title, link.url %>

次に、パーシャルを作成しますshared/_comma.html.erb

,

このアプローチの良い点は、リンク コンテンツが実際に安全かどうかを心配する必要がないことです。別の方法でリストまたはスタイルを設定することを選択した場合は、テンプレートの 1 つまたは両方を変更するだけで簡単です。たとえば、コンマの代わりに垂直にしたい場合は、スペーサー テンプレート<br>の代わりに使用します。,

于 2013-07-10T02:55:37.927 に答える