`

用Rails实现无限级动态树型结构!

阅读更多

今天花了一小段时间写了个基于Rails和xtree的树形例子,还有很多地方需要完善,并且代码比较乱!

Migrate类

  1. class CreateCategories < ActiveRecord::Migration
  2.   def self.up
  3.     create_table "categories", :force => true do |t|
  4.        t.column "name", :string
  5.        t.column "created_at", :datetime
  6.        t.column "parent_id", :integer, :default => 0, :null => false
  7.     end
  8.     %w(item1 item2 item3 item4 item5).each do |name|
  9.           parent = Item.new(:name=>name)
  10.           parent.save
  11.           Item.create(:name=>name+".1", :parent_id=>parent.id)
  12.           Item.create(:name=>name+".2", :parent_id=>parent.id)
  13.           Item.create(:name=>name+".3", :parent_id=>parent.id)
  14.      end
  15.   end
  16.  
  17.   def self.down
  18.     drop_table :categories
  19.   end
  20. end

表结构 

  1. CREATE TABLE categories (
  2.   id                int(11) NOT NULL PRIMARY KEY,              
  3.   name              varchar(50),                               
  4.   parent_id         int(11)                                    
  5. ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='类别表';

控制类 

  1. class CategoryController < ApplicationController
  2.   def index
  3.     @categories = Category.roots   
  4.   end
  5. end

Helper类

  1. module CategoryHelper
  2.   def get_tree(trees, parent)
  3.     tree_html = "";
  4.     trees.each do |tree|
  5.       if tree.is_root?
  6.         tree_html += "var tree_#{tree.id} = new WebFXTreeItem('#{tree.name}');\r\n"
  7.         tree_html += "rootTree.add(tree_#{tree.id});\r\n"
  8.       end
  9.      
  10.       if !tree.is_leaf
  11.         if !tree.is_root?
  12.           tree_html += "var tree_#{tree.id} = new WebFXTreeItem('#{tree.name}');\r\n"
  13.           tree_html += "tree_#{parent.id}.add(tree_#{tree.id});\r\n"
  14.         end
  15.         tree_html += get_tree(tree.children, tree)
  16.       else        
  17.           tree_html += "var tree_#{tree.id} = new WebFXTreeItem('#{tree.name}');\r\n"
  18.         if !parent.nil
  19.           tree_html += "tree_#{parent.id}.add(tree_#{tree.id});\r\n"
  20.         end
  21.       end
  22.     end
  23.     return tree_html
  24.   end
  25. end

模型类category.rb

  1. class Category < ActiveRecord::Base
  2.   acts_as_tree
  3.   validates_presence_of :name
  4.  
  5.   def self.roots
  6.     self.find(:all, :conditions=>["parent_id = ?", 0])
  7.   end
  8.  
  9.   def is_leaf?
  10.     return !self.has_children?  
  11.   end
  12.  
  13.   def is_root?
  14.     return self.parent_id == 0
  15.   end  
  16. end

视图文件

  1. <html>
  2.   <head>
  3.     <title>tree</title>
  4.     <script type="text/javascript" src="/javascripts/xtree.js"></script>
  5.     <script type="text/javascript" src="/javascripts/xloadtree.js"></script>
  6.    
  7. <link type="text/css" rel="stylesheet" href="/stylesheets/xtree.css" />
  8.   </head>
  9.  
  10.   <body>   
  11.     <script type="text/javascript">
  12.       var rootTree = new WebFXTree('Root'); 
  13.       <%= get_tree(@categories, nil)%>
  14.       document.write(rootTree);
  15.     </script>
  16.   </body>
  17. </html>

效果图如下:

注意:需要将xtree组件的xtree.js xtree2.js xloadtree.js拷贝到javascripts目录,把xtree组件里images

目录下的文件拷贝到rails下的public/images目录下,把xtree组件里的xtree.css拷贝到rails下的stylesheets

目录下!

分享到:
评论
5 楼 nixiaode 2007-06-04  
can't convert nil into String

Extracted source (around line #11):

8:     <body>
9:         <script type="text/javascript">
10:             var rootTree = new WebFXTress('Root');
11:             <%= get_tree(@categories, nil)%>
12:             rootTree.write();
13:         </script>
14:     </body>
4 楼 nixiaode 2007-06-04  
先试试看再说 
3 楼 xusaomaiss 2007-06-04  
xtree这东东,我上网找,怎么没找到,你这个DEMO能不能发一份给,或是把Xtree的网址告诉我一下。
email:seaofforest@126.com
2 楼 eastsae 2007-04-27  
正在找这方面的资料,谢谢楼主分享.
1 楼 vfany 2007-04-26  
动态的添加删除不知道楼主做了没?

相关推荐

    phrasing, 为你的Ruby on Rails 应用程序内联编辑短语 !.zip

    phrasing, 为你的Ruby on Rails 应用程序内联编辑短语 ! 语法 ! 短语是网站中实时编辑短语( 副本)的gem 。Phrasing目前正在对主要更新的发布候选内容进行迭代: 4.0.这些版本的自述文件可以在这里找到 "安装在你的...

    用Rails创建的迷你社交网络!! :gem_stone::gem_stone:-Ruby开发

    Rails-Mini-Social-Network用Rails创建的迷你社交网络! 不再维护。 其他版本React版本Vue版本Golang版本快速链接屏幕截图用法Scree Rails-Mini-Social-Network一个由Rails创建的迷你社交网络! 不再维护。 另一个...

    使用Mina轻松部署Rails(而且确实非常快!)

    **标题解析:** "使用Mina轻松部署Rails(而且确实非常快!)" 这个标题指出,我们将探讨如何利用Mina工具高效且迅速地部署Ruby on Rails应用。Mina是一个轻量级、基于任务的部署工具,它允许开发者以SSH协议在远程...

    niklick:赶时髦的人的Rails版本API解决方案模板! (Ruby,Ruby on Rails,REST API,GraphQL,Docker,RSpec,Devise,Postgress DB)

    赶时髦的人的Rails版本API解决方案模板! 版本3.1.0 目录 先决条件 项目设置 为了进行生产,您需要在./config/initializers/cors.rb文件中用客户端应用程序的URL替换星号。 克隆或下载此仓库 运行bundle install ...

    honoka-rails:在您的Rails应用程序上安装Honoka!

    捆绑安装并重新启动服务器,以使文件可通过管道使用。 在app / assets / stylesheets / application.scss中导入Bootstrap(Honoka)样式: $ mv app/assets/stylesheets/application.css app/assets/sty

    safer_rails_console:使Rails Console的危险性降低!

    通过警告,颜色编码,自动沙盒以及允许只读外部连接(禁用作业排队,非GET请求等),此宝石使Rails控制台会话在指定环境中的危险性降低。 安装 将此行添加到您的应用程序的Gemfile中: gem 'safer_rails_console'...

    Rails 101 入门电子书

    - 安装Rails: 使用gem工具安装最新的Rails版本。 - 测试安装: 创建一个简单的Rails应用来验证是否成功安装。 #### 五、练习作业0-Hello World - **目标**: - 学习如何创建第一个Rails应用程序。 - **过程**: -...

    Rails实现的简历系统

    在本文中,我们将深入探讨如何使用Ruby on Rails(Rails)框架构建一个简历系统。Rails是一个流行的Web应用程序开发框架,它遵循MVC(模型-视图-控制器)架构模式,简化了开发过程。以下是对标题和描述中涉及的关键...

    inject-some-sql:将SQL注入Ruby on Rails应用程序中很有趣!

    注入一些SQL 这些是示例Rails应用程序,用于演示可以在Rails中注入SQL的多种方式。建立克隆仓库: git clone https://github.com/presidentbeef/inject-some-sql.git选择Rails 5,Rails 4或Rails3。它们每个都有自己...

    Rails上的API:使用Rails构建REST APIAPIs on Rails: Building REST APIs with Rails

    在本篇内容中,我们将深入探讨如何利用Ruby on Rails(简称Rails)这一强大的Web应用程序框架来构建可伸缩且易于维护的RESTful API。Rails以其简洁优雅的语法、高效的开发速度以及良好的社区支持而闻名,这使得它...

    rails实现验证码实例

    实例的源代码 博文链接:https://babo.iteye.com/blog/72298

    phrasing:为Ruby on Rails应用程序内联编辑短语!

    使用它来连接您现有的用户身份验证系统以使用Phrasing。 例如: module PhrasingHelper def can_edit_phrases? current_user . is_admin? endend 在应用程序布局文件中&lt;body&gt;标记的正下方包括短语html初始

    Ruby on Rails入门例子

    2. 创建资源:使用`rails generate controller Posts`生成控制器,再用`rails generate scaffold Post title:string content:text`生成模型和相关的控制器、视图及路由。 3. 迁移数据库:编写迁移文件,更新数据库表...

    中文版rails教程

    1. **生成资源(Generating Resources)**:使用`rails generate`命令可以快速创建模型、控制器、视图等文件,如`rails generate scaffold Post title:string content:text`会生成一个名为Post的资源,包含相关的...

    rails_study:学习铁轨!

    您可能想要涵盖的内容: Ruby版系统依赖配置数据库创建数据库初始化如何运行测试套件服务(作业队列、缓存服务器、搜索引擎等) 部署说明… 如果您不打算运行rake doc:app请随意使用不同的标记语言。系统环境, ...

    first-project-rails:Sinau Ruby on Rails!

    自述文件 该自述文件通常会记录启动和运行应用程序所需的所有步骤。 您可能要讲的内容: Ruby版本 系统依赖 配置 数据库创建 数据库初始化 如何运行测试套件 服务(作业队列,缓存服务器,搜索引擎等) ...

Global site tag (gtag.js) - Google Analytics