2009-08-25 24 views
0

私の中心的なウェブサイト構造にawesome_nested_setを使用しています。ネストされたセットのUL/LIベースのインデックスバーを構築することができますが、ネストされたセットのデータベースの強度が低いことを利用したいと考えています。 acts_as_treeを使用していたとき、私はインデックスバーを構築する再帰関数を持っていました。それはちょうどそれが任意の子供などが発生した場合はそれ自身を呼び出した...私は、これを行うには、より良い方法があるのだろうか?私は今のところ(未テスト)以下を作ってみた:http://dev.rubyonrails.org/ticket/9678インデックスバー(UL、LIベース)を再帰的に作成

def recursive_indexbar(parent, parameters) 
    return unless parameters.length == 1 && parameters.first.to_i > 0 

    maximum_level = parent.level + parameters.first 

    content_tag :ul do 
     parent.descendants.current.visible.front_end.recurse do |component_instance, block| 
     content_tag :li, :class => (@item.component_instance == component_instance) ? 'uber' : false do 
      component_instance.name 
      unless component_instance.leaf? 
      content_tag :ul, block.call 
      end 
     end 
     end 
    end 
    end 

をnested_setには再帰関数が存在しないので、今では実際に動作しない、私はちょうどこのリンクから、それを拾いました。このページの最後のコメントを参照してください。

多くのレベルに深く進んでいますが、実装するのは簡単です。

誰でも私に任意のポインタを教えてもらえますか?

答えて

1

私はそれに答えるでしょう:)基本的には、ラムダと戻り値関数を使用して、内容を入れ子にした配列の束を作成しました。次に、このビューをストレートテキストに逆コンパイルします。

def new_recursive(parent, parameters) 
    return unless parameters.length == 1 && parameters.first.to_i > 0 

    maximum_level = parent.level + parameters.first 

    recurse = lambda do |component_instance| 
     component_instance.children.current.visible.front_end.collect do |child| 
     content_tag :li, :class => (@item.component_instance == child ? 'uber' : nil) do 
      returning [] do |content| 
      content << link_to(child.name, [child.parent, child.instance]) 
      unless child.leaf? || child.level == maximum_level 
       content << content_tag(:ul, recurse.call(child)) 
      end 
      end 
     end 
     end 
    end 

    content_tag :ul, recurse.call(parent) 
    end 

(より論理的なように見える)それぞれを使用することにも注意してください。 Collectは、私たちが望む配列を返します。元の配列内に追加または中止を停止すると、すべてが破壊されます。

これは将来誰かに役立つことを願っています。私の用途に合わせてカスタマイズされていますが、任意のツリー構造に転送されます。私はネストされたセットで効率的に動作するようになると思うが、索引バーは通常1〜2レベルの深さしかないので、再帰性は制御不能にならないだろう。

関連する問題