0

使用 RoR,我想要一个助手来编写一个目录菜单,其中根部分是其子部分的下拉菜单。在 each/do 循环中,我需要在输出class="dropdown"li 和class="dropdown-toggle" data-toggle="dropdown"链接之前检查一个部分是否有小节。

有没有办法在 each/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
4

3 回答 3

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/以供审查。

于 2013-02-13T19:52:18.683 回答
0

如果我正确阅读了您的问题-假设 fetch_all_sections(standard) 返回一个可枚举的对象,例如 Array,您可以添加一个自定义迭代器来获得您想要的内容:

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

ps 我喜欢@tokland 的内联答案


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

produces:
1,2
2,3
3,4
4,
于 2013-02-13T20:08:18.473 回答
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
于 2013-02-13T20:42:56.533 回答