我可以在Rails中使用link_to创建一系列链接吗?

bla*_*edo 12 ruby arrays join ruby-on-rails link-to

我有一个我想要显示的网址/标题对值列表.(更具体地说,每个对象都有自己的链接列表,一些有0,有些有1,有些有更多.)我希望它们出现在逗号分隔的列表中.所以我在.erb文件中写了这个:

<%= links.map{|wl| link_to wl.title, wl.url}.join(', ') %>
Run Code Online (Sandbox Code Playgroud)

令我惊讶的是,这显示了我想要创建的链接的HTML代码的逗号分隔列表; 也就是说,它采用了所有尖括号和&符号编码.为了确保高阶函数没有任何有趣的东西,我尝试了一个更为迫切的版本:

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

当然,结果相同.但我不认为我在滥用link_to,因为如果我修改它

<% links.each do |wl| %>
  <%= link_to(wl.title, wl.url) %>,
<% end %>
Run Code Online (Sandbox Code Playgroud)

然后它实际上创建了链接.它几乎就是我想要的,除了在最后一个之后还有一个额外的逗号.引擎盖下是否有一些魔法可以link_to根据其输出的前进方式采取不同的行动?有没有办法绕过那个魔法?该join语义是什么我想在这里,我可以明显地弄清楚如何推出自己的(使用each_index,我猜),但它似乎是一个非常沉重的和未红宝石解决什么必须是一个常见的问题.

Ger*_*haw 15

使用safe_join结合html_safe的分隔字符串.

例:

<%= safe_join(links.map { |l| link_to(l.title, l.url) }, ", ".html_safe) %>
Run Code Online (Sandbox Code Playgroud)


Jam*_*Lim 12

尝试

<%= links.map{|wl| link_to wl.title, wl.url}.join(', ').html_safe %>
Run Code Online (Sandbox Code Playgroud)

这指示Rails不要逃避文本.

  • 如果你这样做,请小心.当wl.title来自外部源时,这是一个可利用的漏洞.使用`h(wl.title)`或者更好的是使用`safe_join` (4认同)

Ale*_*hey 5

虽然使用的建议html_safe会得到您想要的结果,但我建议您不要在视图中粘贴这样的循环.在rails中有一种非常好的方法可以满足您的需求:

在您当前拥有循环的主视图文件中,将其更改为:

<%= render partial: 'links/link', collection: links, spacer_template: 'shared/comma' %>
Run Code Online (Sandbox Code Playgroud)

然后创建一个部分 links/_link.html.erb

<%= link_to link.title, link.url %>
Run Code Online (Sandbox Code Playgroud)

然后创建一个部分 shared/_comma.html.erb

,
Run Code Online (Sandbox Code Playgroud)

这种方法的好处是您不必担心链接内容是否真的安全,如果您选择以另一种方式列出或设置样式,就像更改其中一个或两个模板一样简单.例如,如果您使用逗号而不是逗号,则需要将其垂直使用<br>而不是使用,间隔模板.