Ruby .each不像预期的那样在数组中循环

时间:2012-08-16 21:58:09

标签: ruby-on-rails ruby arrays tags each

极端Ruby / Rails新手:我正在尝试链接到块中包含的每个帖子的搜索操作:

<% split_tags = post.tags.split(',') %> # returns ["food", "computers", "health"] %>
<p>Keywords: <%= split_tags.each {|tag| link_to(tag, front_search_tag_path(:tag => tag))}) %></p>

但它返回的只是Keywords: ["food", "computers", "health"]。 不应该.each遍历数组并提供每个search_tag_path的链接,并将标记作为参数吗?

3 个答案:

答案 0 :(得分:4)

不,#each只执行一个块,它不会累积任何数据。

[1, 2, 3].each{ |n| "Link to item #{n}" } #=> [1, 2, 3]

您有两个选项,使用map来累积数据:

[1, 2, 3].map{ |n| "Link to item #{n}" }.join("\n") #=> "Link to item 1\nLink to item 2\nLink to item 3"

或直接在块中输出:

[1, 2, 3].each{ |n| puts "Link to item #{n}" }

打印:

Link to item 1
Link to item 2
Link to item 3

在您的情况下,这将是以下两个选项。我更喜欢后者。

<p>Keywords: <%=raw split_tags.map{|tag| link_to(tag)}.join %></p>

<p> Keywords:
  <% split_tags.each do |tag| %>
    <%= link_to(tag) %>
  <% end %>
</p>

答案 1 :(得分:0)

你可能意味着

<% split_tags = post.tags.split(',') %> # returns ["food", "computers", "health"] %>
<p>Keywords:
  <% split_tags.each do |tag| %>
  <%= link_to(tag, front_search_tag_path(:tag => tag)) %>
  <% end %>
</p>

<% split_tags = post.tags.split(',') %> # returns ["food", "computers", "health"] %>
<p>Keywords:
  <%= split_tags.map{|tag| link_to(tag, front_search_tag_path(:tag => tag))}.join %>
</p>

答案 2 :(得分:0)

不,Array#each的返回值是数组本身(请参阅http://www.ruby-doc.org/core-1.9.3/Array.html#method-i-each

您需要使用Array#collect(或其别名map),它将返回一系列链接(请参阅http://www.ruby-doc.org/core-1.9.3/Array.html#method-i-map)。然后,您可以使用join将该数组转换为单个字符串。所以,你的代码看起来像

<% split_tags = post.tags.split(',') %>
<p>Keywords: <%= split_tags.collect {|tag| link_to(tag, front_search_tag_path(:tag => tag))}).join %></p>

但是,.html_safe之后可能需要.join。更好的是,做一些像:

<% split_tags = post.tags.split(',') %>
<p>Keywords: 
<% split_tags.each do |tag| %>
  <%= link_to(tag, front_search_tag_path(:tag => tag)) %>
<% end %>
</p>