13

我有一个要显示的 url/title 对中的值列表。(更具体地说,每个对象都有自己的链接列表,有些是 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组合 with 。html_safe

例子:

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

尝试

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

这指示 Rails 不转义文本。

于 2013-07-10T02:08:46.893 回答
6

虽然使用的建议html_safe会得到你想要的结果,但我建议你不要在你的视图中坚持这样的循环。rails 有一个非常好的方法来做你正在寻找的东西:

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

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

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

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

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

,

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

于 2013-07-10T02:55:37.927 回答
2

试着把它放在你的 ApplicationHelper

  def sep(separator)
    ->(a, b){ a << separator.html_safe << b }
  end

然后在您的模板中执行此操作

links.map{|wl| link_to wl.title, wl.url}.reduce(&sep(", "))

您可以通过这种方式使用任何您喜欢的分隔符。你也不需要调用html_safe整个事情。只有分隔符。所以这种方法更安全。

于 2015-09-14T01:02:42.527 回答
1

默认情况下,Rails 会将字符串转换为 html 安全的。您的 join 调用将链接输出转换为字符串,这就是文本被转义的原因。尝试在 join 调用之后添加 .html_safe ,这将告诉 rails 您提供的文本是 html 安全的,因此不需要转义。有关其工作原理的更多信息,请访问:http: //yehudakatz.com/2010/02/01/safebuffers-and-rails-3-0/

于 2013-07-10T01:37:17.597 回答
0

你可以使用RAW:

= raw inks.map{|wl| link_to wl.title, wl.url}.join(', ')

或者

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

正如亚历克斯·皮奇建议的那样

于 2021-06-22T10:24:49.470 回答