今天花了一小段时间写了个基于Rails和xtree的树形例子,还有很多地方需要完善,并且代码比较乱!
Migrate类
- class CreateCategories < ActiveRecord::Migration
- def self.up
- create_table "categories", :force => true do |t|
- t.column "name", :string
- t.column "created_at", :datetime
- t.column "parent_id", :integer, :default => 0, :null => false
- end
- %w(item1 item2 item3 item4 item5).each do |name|
- parent = Item.new(:name=>name)
- parent.save
- Item.create(:name=>name+".1", :parent_id=>parent.id)
- Item.create(:name=>name+".2", :parent_id=>parent.id)
- Item.create(:name=>name+".3", :parent_id=>parent.id)
- end
- end
- def self.down
- drop_table :categories
- end
- end
表结构
- CREATE TABLE categories (
- id int(11) NOT NULL PRIMARY KEY,
- name varchar(50),
- parent_id int(11)
- ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='类别表';
控制类
- class CategoryController < ApplicationController
- def index
- @categories = Category.roots
- end
- end
Helper类
- module CategoryHelper
- def get_tree(trees, parent)
- tree_html = "";
- trees.each do |tree|
- if tree.is_root?
- tree_html += "var tree_#{tree.id} = new WebFXTreeItem('#{tree.name}');\r\n"
- tree_html += "rootTree.add(tree_#{tree.id});\r\n"
- end
- if !tree.is_leaf?
- if !tree.is_root?
- tree_html += "var tree_#{tree.id} = new WebFXTreeItem('#{tree.name}');\r\n"
- tree_html += "tree_#{parent.id}.add(tree_#{tree.id});\r\n"
- end
- tree_html += get_tree(tree.children, tree)
- else
- tree_html += "var tree_#{tree.id} = new WebFXTreeItem('#{tree.name}');\r\n"
- if !parent.nil?
- tree_html += "tree_#{parent.id}.add(tree_#{tree.id});\r\n"
- end
- end
- end
- return tree_html
- end
- end
模型类category.rb
- class Category < ActiveRecord::Base
- acts_as_tree
- validates_presence_of :name
- def self.roots
- self.find(:all, :conditions=>["parent_id = ?", 0])
- end
- def is_leaf?
- return !self.has_children?
- end
- def is_root?
- return self.parent_id == 0
- end
- end
视图文件
- <html>
- <head>
- <title>tree</title>
- <script type="text/javascript" src="/javascripts/xtree.js"></script>
- <script type="text/javascript" src="/javascripts/xloadtree.js"></script>
- <link type="text/css" rel="stylesheet" href="/stylesheets/xtree.css" />
- </head>
- <body>
- <script type="text/javascript">
- var rootTree = new WebFXTree('Root');
- <%= get_tree(@categories, nil)%>
- document.write(rootTree);
- </script>
- </body>
- </html>
效果图如下:
注意:需要将xtree组件的xtree.js xtree2.js xloadtree.js拷贝到javascripts目录,把xtree组件里images
目录下的文件拷贝到rails下的public/images目录下,把xtree组件里的xtree.css拷贝到rails下的stylesheets
目录下!