如何检查Ruby中每个/ do循环中下一个项的属性?

时间:2013-02-13 19:33:23

标签: ruby ruby-on-rails-3

使用RoR,我希望帮助者编写一个目录菜单,其中根部分是其子部分的下拉菜单。在每个/ do循环中,我需要在链接上输出class="dropdown"和链接上的class="dropdown-toggle" data-toggle="dropdown"之前检查某个部分是否包含子部分。

有没有办法检查每个/ do循环中下一个项目(如果有)的属性?或者我是否需要切换到带索引的循环?

这是我的目录助手。

def showToc(standard)
  html = ''
  fetch_all_sections(standard).each do |section|
    html << "<li>" << link_to("<i class=\"icon-chevron-right\"></i>".html_safe + raw(section[:sortlabel]) + " " + raw(section[:title]), '#s' + section[:id].to_s) << "</li>"
    end
  end
  return html.html_safe
end

3 个答案:

答案 0 :(得分:2)

您可以使用抽象Enumerable#each_cons。一个例子:

>> xs = [:a, :b, :c]
>> (xs + [nil]).each_cons(2) { |x, xnext| p [x, xnext] }
[:a, :b]
[:b, :c]
[:c, nil]

也就是说,请注意您的代码中充满了单一的Ruby,您应该将其发布到https://codereview.stackexchange.com/进行审核。

答案 1 :(得分:0)

如果我正确地阅读你的问题 - 假设fetch_all_sections(标准)返回一个可枚举的数组,你可以添加一个自定义迭代器来获得你想要的东西:

class Array
   #yields |current, next|
   def each_and_next
      @index ||= 0
      yield [self[@index], self[@index +=1]] until (@index == self.size)
      @index = 0
   end
end

P.S。我喜欢@ tokland的内联答案


a = [1,2,3,4]
a.each_and_next { |x,y| puts "#{x},#{y}" }

produces:
1,2
2,3
3,4
4,

答案 2 :(得分:0)

我找到了class="dropdown"<li>的方法,而链接上的class="dropdown-toggle" data-toggle="dropdown"不会影响锚标记。因此,在这种情况下,我可以检查截面深度是否为0并相应地采取行动。其他答案可能与大多数人更相关,但这对我有用。

def showToc(standard, page_type, section = nil, nav2section = false, title = nil, wtf=nil)
  html = ''
  new_root = true

  fetch_all_sections(standard).each do |section|
    if section[:depth] == 0
      if !new_root
        # end subsection ul and root section li
        html << "</li>\n</ul>"
        new_root = true
      end
      html << "<li class=\"dropdown\">" << link_to("<i class=\"icon-chevron-right\"></i>".html_safe + raw(section[:sortlabel]) + " " + raw(section[:title]), '#s' + section[:id].to_s, :class => "dropdown-toggle", :data => {:toggle=>"dropdown"})
    else
      # write ul if new root
      if new_root
        new_root = false
        html << "<ul class=\"dropdown-menu\">\n" << "<li>" << link_to(raw(section[:sortlabel]) + " " + raw(section[:title]), '#s' + section[:id].to_s) << "</li>"
      else
        html << "<li>" << link_to(raw(section[:sortlabel]) + " " + raw(section[:title]), '#s' + section[:id].to_s) << "</li>"
      end
    end
  end
  return html.html_safe
end