我有一个列表,我想显示的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的引擎盖下是否有一些魔法,这使得它根据其输出位置的不同而有所不同?有没有办法绕过这个魔法?连接语义将正是我想要的,我可以明确地知道如何滚动自己的(使用each_index,我猜),但它似乎是一个非常繁重和非Ruby的解决方案,一定是一个常见的问题.
解决方法
虽然使用html_safe的建议会得到您要执行的结果,但我建议您不要在您的视图中粘贴这样的循环.在轨道上有一个完美的方法来做你想要的:
在您的主视图文件中,您当前将循环更改为:
<%= render partial: 'links/link',collection: links,spacer_template: 'shared/comma' %>
然后创建一个部分链接/ _link.html.erb
<%= link_to link.title,link.url %>
然后创建一个部分共享/ _comma.html.erb
,
关于这种方法的好处是,如果您的链接内容实际上是安全的,并且如果您选择列出或创建样式,那么您不用担心,只需更改一个或两个模板就可以简单.例如,如果不是逗号,那么您决定要垂直使用< br>而不是在你的间隔模板中.