`

Rails使用EXT Tree实现级联树

阅读更多
首先下载ext的js包,可以到http://extjs.com/下载,现在有两个版本1.0和2.0,如果下载后的包名为ext1.0或者2.0则去掉版本号,统一改成ext,方便以后写路径名称;这个ext里的资源是一个总包,如果你对这个资源包里的内容很熟悉的话,可以对资源内容进行有选择性的使用;

将改好名的ext包拷贝到项目目录/publi下,形成路径public/ext,由于ext只是一个js包,并不是rails的插件;



其他操作如下:



数据库:

DROP TABLE IF EXISTS `nested_set_items`;

CREATE TABLE `nested_set_items` (

  `id` int(11) NOT NULL auto_increment,

  `parent_id` int(11) default NULL,

  `lft` int(11) NOT NULL default '0',

  `rgt` int(11) NOT NULL default '0',

  `name` varchar(100) NOT NULL default '',

  PRIMARY KEY  (`id`)

);



LOCK TABLES `nested_set_items` WRITE;

INSERT INTO `nested_set_items` VALUES (1,NULL,1,14,'Root');

INSERT INTO `nested_set_items` VALUES (2,1,2,7,'Child 1');

INSERT INTO `nested_set_items` VALUES (3,2,3,4,'Child 1.1');

INSERT INTO `nested_set_items` VALUES (4,2,5,6,'Child 1.2');

INSERT INTO `nested_set_items` VALUES (5,1,8,13,'Child 2');

INSERT INTO `nested_set_items` VALUES (6,5,9,10,'Child 2.1');

INSERT INTO `nested_set_items` VALUES (7,5,11,12,'Child 2.2');

UNLOCK TABLES;


控制器:

class CategoriesController < ApplicationController
  
  def index(id = params[:node])   
    puts id
    respond_to do |format|   
      format.html # render static index.html.erb   
      format.json { render :json => Category.find_children(id)}   
    end  
  end
end
model:

如果根据网上的demo来实现的话会出现node id不正确,id会出现类似ynode-xxx(xxx为数字),导致程序错误;本想去修改js的,但是js内容很庞大就放弃了,从而在mode里组织node的数据,而后觉得这种形式更好一些,可以根据业务逻辑进行控制;

class Category < ActiveRecord::Base
  establish_connection :localhost 
  acts_as_nested_set
  
  #首先先得到树的根节点,再根据传过来的id找到根的子节点   
  def self.find_children(start_id = nil)  
    data = Array.new
    if start_id.blank?
      root_nodes
    else
      @nodes = find :all,:conditions=>"parent_id=#{start_id}"
      @nodes.each { |node|
          
        if leaf? node.id
           data +=   [{"text"  =>  node.name, "id"  => node.id, "cls" => "folder", "leaf"  => false}] 
        else
           data +=   [{"text"  =>  node.name, "id"  => node.id, "cls" => "folder", "leaf"  => true}]
        end   
        
      }                         
    end 
    return  data
  end  
  
  #如果parent_id为空,则为树的根节点   
  def self.root_nodes   
    find(:all, :conditions => 'parent_id IS NULL')   
  end 

  def self.leaf?(nodeid)  
    children = Category.find :all,:conditions=>["parent_id =?",nodeid]
    if children.size > 0
       return true;
    else
       return false;
    end
  end  
   
end



视图:

<html>  
  <head>  
    <meta http-equiv="content-type" content="text/html;charset=UTF-8"/>  
    <title>Rails Ext Tree 测试</title>  
    <%= stylesheet_link_tag "../ext/resources/css/ext-all.css" %>
    <%= javascript_include_tag :defaults %>
    <%= javascript_include_tag "../ext/adapter/prototype/ext-prototype-adapter.js" %>
    <%= javascript_include_tag "../ext/ext-all.js" %>

        <%= javascript_include_tag "../ext/adapter/ext/ext-base.js" %>

         <%= javascript_include_tag "../ext/ext-all-debug.js" %>
  </head>  
  <body>  
    <div id="category-tree" style="padding:20px"></div>
    <% javascript_tag do -%>  
      Ext.onReady(function(){        
      var root = new Ext.tree.AsyncTreeNode({   
      text: 'EXT测试树结构ROOT', 
      draggable:false,
      id:'1'   
      });   
    
      var tree = new Ext.tree.TreePanel({  
      animate:false,
      loader: new Ext.tree.TreeLoader({   
      dataUrl:'/categories',   
      requestMethod:'GET',   
      baseParams:{format:'json',lib:'yui'}   
      }),   
      renderTo:'category-tree',   
      root: root,   
      rootVisible:true ,
      autoScroll:true,   
      enableDD:false,
      containerScroll: true
      });  
    
      tree.on('click', function(node){
         alert(node.text);
      });
    
    
      tree.setRootNode(root);
      tree.render(); 
      root.expand();   
      });   
    
    
    
    <% end -%>  
  </body>  
</html> 
分享到:
评论

相关推荐

    Rails中应用Ext.tree:以中国的省市地区三级联动选择为例

    这篇博客文章“Rails中应用Ext.tree:以中国的省市地区三级联动选择为例”提供了一个实用的示例,教我们如何利用Ext.js库中的Tree组件来实现这种功能。 首先,让我们了解Rails和Ext.js的基本概念。Rails是基于Ruby...

    用Ext Scaffold插件打造Rails的Ext风格

    标题中的“用Ext Scaffold插件打造Rails的Ext风格”指的是在Ruby on Rails(Rails)框架中,使用Ext JS库和一个名为“Ext Scaffold”的插件来创建图形用户界面(GUI)。Ext JS是一个流行的JavaScript库,提供了丰富...

    Rails GUI Development with Ext JS 10-Jan-08 RUG-B.pdf

    ### Rails GUI 开发结合 Ext JS #### 概述 Rails GUI 开发与 Ext JS 的结合是一种将 Ruby on Rails(简称 Rails)的后端能力与 Ext JS 的前端界面设计能力相结合的技术方案。Rails 是一个用于 Web 开发的模型-视图...

    Struts2和Rails的国际化实现

    3. **在视图中使用**:在Rails的视图模板中,使用`t`或`translate`辅助方法来获取翻译,如: ```erb ('hello') %&gt; ``` 4. **控制器和模型中的翻译**:在控制器和模型中,可以使用`I18n.t`方法获取翻译。 5. **...

    在Rails中使用SSL

    在Rails中使用SSL(安全套接层)是构建Web应用时确保数据传输安全的重要步骤。Rails框架支持在应用程序中轻松集成SSL,以保护用户敏感信息,如登录凭据和支付详情。以下是一些关于在Rails中实施SSL的关键知识点: 1...

    Rails 101 入门电子书

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

    ivr-phone-tree-rails:使用Twilio实现自动电话线的示例应用程序

    带有Ruby on Rails和Twilio的IVR电话树 IVR(交互式语音响应)是自动电话系统,可以促进呼叫者与企业之间的通信。 如果您在响应一系列自动提示后曾经致电您的信用卡公司来查询余额,则使用了IVR。 了解如何使用...

    Rails项目源代码

    这个“Rails项目源代码”是一个使用Rails构建的图片分享网站的完整源代码,它揭示了如何利用Rails的强大功能来创建一个允许用户上传、分享和浏览图片的应用。 1. **Rails框架基础**: Rails的核心理念是DRY(Don't...

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

    4. **实现认证和授权机制**:为了保证API的安全性,需要实现用户认证和权限管理功能,例如使用JWT(JSON Web Tokens)、OAuth等方式。 5. **错误处理**:定义一套统一的错误处理策略,当请求无法正确处理时能够向...

    使用Aptana+Rails开发Rails Web应用(中文)

    本教程将详细介绍如何使用Aptana与Rails结合,创建一个功能完备的Web应用程序。 首先,我们需要安装Aptana Studio。你可以从其官方网站下载最新版本的安装包。安装过程中,遵循提示进行,确保选择自定义安装并勾选...

    shoppe-example, 在 Rails 中使用Shoppe平台的示例存储实现.zip

    shoppe-example, 在 Rails 中使用Shoppe平台的示例存储实现 这是一个 Rails 应用程序,它使用 Shoppe 构建。 它具有一个可以爱的设计,以充分演示Shoppe平台提供的功能以及它在 Rails 应用程序中的。 正在启动要开始...

    rails中使用javascript日期控件

    这篇博客“rails中使用javascript日期控件”探讨的就是如何在Rails应用中集成JavaScript日期控件,特别是通过一个名为WebCalendar.js的库来实现这一功能。WebCalendar.js是一个轻量级的JavaScript库,用于创建交互式...

    中文版rails教程

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

Global site tag (gtag.js) - Google Analytics