使用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
答案 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