极端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的链接,并将标记作为参数吗?
答案 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>