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

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

 

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

   <% a <   

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

  ,  

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

虽然使用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

 , 

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

尝试

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

这指示Rails不要逃避文本。

在分隔符字符串上使用safe_joinhtml_safe

例:

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

尝试将它放在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 。 只有分隔符。 所以这种方法更安全。

Rails默认将字符串转换为html安全。 您的加入调用将链接输出转换为字符串,这就是文本被转义的原因。 尝试在加入调用后添加.html_safe,这将告诉rails您提供的文本是html安全的,因此不需要进行转义。 关于它如何工作的更多信息:http: //yehudakatz.com/2010/02/01/safebuffers-and-rails-3-0/