Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 我可以在Rails中使用link_to创建一个链接数组吗?_Ruby On Rails_Ruby_Arrays_Join_Link To - Fatal编程技术网

Ruby on rails 我可以在Rails中使用link_to创建一个链接数组吗?

Ruby on rails 我可以在Rails中使用link_to创建一个链接数组吗?,ruby-on-rails,ruby,arrays,join,link-to,Ruby On Rails,Ruby,Arrays,Join,Link To,我有一个url/标题对中要显示的值列表。(更具体地说,每个对象都有自己的链接列表,有些链接为0,有些链接为1,有些链接为更多。)我希望它们出现在逗号分隔的列表中。所以我在我的.erb文件中写到: <%= links.map{|wl| link_to wl.title, wl.url}.join(', ') %> 然后它实际上创建链接。这几乎正是我想要的,除了最后一个逗号后有一个额外的逗号。在引擎盖下是否有一些神奇的link_to,使其根据输出的方向做出不同的动作?有没有办法绕过这个

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

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

然后它实际上创建链接。这几乎正是我想要的,除了最后一个逗号后有一个额外的逗号。在引擎盖下是否有一些神奇的
link_to
,使其根据输出的方向做出不同的动作?有没有办法绕过这个魔法?
join
语义正是我在这里想要的,我显然可以想出如何使用我自己的(我猜是使用每个索引),但这似乎是一个非常沉重的、非Ruby的解决方案,解决了一个常见的问题。

Rails默认情况下会将字符串转换为html安全的。join调用将链接输出转换为字符串,这就是文本随后被转义的原因。尝试在join调用后添加.html_safe,这将告诉rails您提供的文本是html安全的,因此不需要转义。更多关于如何工作的信息,请访问:

试试看

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


这将指示Rails不要转义文本。

虽然使用
html\u safe
的建议将得到您想要的结果,但我建议您不要在视图中使用这样的循环。在rails中有一种非常好的方法可以实现您想要的功能:

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

<%= render partial: 'links/link', collection: links, spacer_template: 'shared/comma' %>
然后创建一个部分的
shared/_comma.html.erb

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

这种方法的好处是,你不必担心你的链接内容是否真的安全,如果你选择以另一种方式列出或设置它的样式,只需更改一个或两个模板即可。例如,如果您决定将其垂直放置,并在间隔模板中使用

而不是

尝试将其放置在ApplicationHelper中

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

你可以用任何你喜欢的分隔符。您也不需要在整个过程中调用
html\u safe
。只有分离器。因此此方法更安全。

在分隔符字符串上使用
safe\u join
html\u safe
组合使用

例如:

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


?啊哈,谢谢!我有一种预感,会有类似于
html\u safe
的东西,但这正是我真正想要的——我知道这一定有一个成语。对于这个问题的未来读者,请注意:为了防止链接和逗号之间出现空白,我确实必须在EOF强制包含部分链接的文件不进行EOL,但一旦我这样做了,它就工作得很好。这有很多间接性。似乎不是最好的设计。间接寻址通常不利于可读性和可维护性。也许,如果你解释为什么在视图中粘贴循环是不好的,我会更理解你的推理。Martin,循环在视图中是不好的,因为代码在视图中是不好的。它不属于它的地方。我想坚持回答最初的问题,但为了更进一步,我甚至不愿做我上面提出的事情。实际上,我会有一个装饰者/演示者支持这个视图,并在其上使用一个名为
links
的方法。该方法实际上可以实现我上面提到的基本功能,因此您仍然可以使用partials,但是您的顶层视图可以使用像
这样简单的东西,它比循环或数组操作块更易于阅读和理解。@AlexPeachey,而我大体上同意没有太多代码的精神从某种角度来看,我认为理想不一定是“没有代码”,而是“没有逻辑”。迭代不是逻辑,它是完全可读的。你真的会有一个内容只有一个逗号的分部吗?这并没有增加很多价值;你所做的一切就是让开发人员以制作简单列表的名义处理更多文件。我喜欢这个答案,因为它减少了间接性。间接寻址通常不利于可读性和可维护性。如果这样做,请非常小心。当wl.title来自外部源时,这是一个可利用的漏洞。使用
h(wl.title)
或者更好地使用
safe\u-join
@levinalex不会
link\u-to
已经返回了一个安全值吗?你能举一个利用漏洞的例子吗?这个问题与Jim Lim的答案所面临的问题是一样的,它会使你的代码面临容易被利用的漏洞的风险。使用
safe\u-join
。你就是国王!html_在逗号上是否安全?逗号没有html安全项,对吗?如果将非html安全字符串(如“
”、“
)与安全html字符串混合,则结果是非html安全字符串,并将被转义,因此您需要明确指出常量字符串是html安全的。
  def sep(separator)
    ->(a, b){ a << separator.html_safe << b }
  end
links.map{|wl| link_to wl.title, wl.url}.reduce(&sep(", "))
<%= safe_join(links.map { |l| link_to(l.title, l.url) }, ", ".html_safe) %>