`
edwardpro
  • 浏览: 301295 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

rails中递归的烦闷

阅读更多
因为要实现树展现,当然用非递归也可以的,不过考虑灵活性和维护简便还是用递归实现,以下的例子是在helper中使用的,不过rails的输出始终让我有点找不到北,毕竟在webwork中如果实在要输出依然可以通过response得到输入流的,但rails似乎没有,于是只能用如下如此愚蠢的方法实现了:

  protected
  @@body=""
  def build_tree(father_id=0,level=1)
   
    @trees=Site.find(:all,:conditions => "father_id=#{father_id}")
    @trees.each do |tree|
      @t=""
       (level-1).times do
        @t+="++"    
      end
      @@body +="#{@t}#{tree.tree_name}(#{tree.id})<br/>"
      build_tree(tree.id,level+1)
    end
    return @@body
  end

最后结果灭有问题,但这样用返回类变量方法总不是太好,还米有想出特别好的解决方案只能先如此了。接下来要实现js的权限菜单也会采用此法。
分享到:
评论
2 楼 edwardpro 2007-05-26  
谢谢
1 楼 liusong1111 2007-05-25  
@trees和@t没必要 是成员变量吧,局部变量就可以。
递归时充份利用返回值:

def build_tree(father_id=0,level=1)
  ...
  buffer = "#{@t}#{tree.tree_name}(#{tree.id})"
  buffer += build_tree(tree.id,level+1)
  return buffer
end

或者传入一个buffer作为输出的对象,build_tree返回值无意义:
def build_tree(buffer,father_id=0,level=1)
  ...
  buffer << "#{@t}#{tree.tree_name}(#{tree.id})"
  build_tree(buffer,tree.id,level+1)
end

buffer = ""
build_tree(buffer)
利用buffer值。

相关推荐

Global site tag (gtag.js) - Google Analytics