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)が配列などの列挙可能なものを返す場合、カスタムイテレータを追加して必要なものを取得できます:

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"オンにする方法を見つけました。したがって、この場合、セクションの深さが 0 であるかどうかを確認し、それに応じて処理することができます。他の回答はおそらくほとんどの人にとってより関連性がありますが、これが私にとってうまくいったものです.<li>class="dropdown-toggle" data-toggle="dropdown"

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 に答える