jquery和javascript不会因为程序的排名而又任何变化,他们依然以十足的活力,在web开发中纵马驰骋。rails和ruby也是 一样,及时是一把钝刀,用的熟了,那也可以庖丁解牛,况且这两R就像足球场上的每个罗纳尔多一样,犀利无比。总之,坚持,就像开放一样,是软件开发者、团队的终身信条。
废话一堆,这里将jstree前面曾经采用的创建node的变通方法,进行修改。
1.首先明确在展示tree的时候,不能够将所有node的status设定为closed,必须加以判断,如果有child,则设置为closed,如果没有child,则设置为opened;
所以将private方法修改如下:
def get_region_tree_json(regions) json_data = String.new json_data += "[" regions.each do |region| unless region.child_regions.blank? json_data += "{\"data\":\"#{region.name}\",\"attr\":{\"id\":\"#{region.id}\"},\"state\":\"closed\"}" else json_data += "{\"data\":\"#{region.name}\",\"attr\":{\"id\":\"#{region.id}\"},\"state\":\"opened\"}" end json_data += "," unless region == regions.last end json_data += "]" return json_data end
2.只是做上述工作还有问题:会发现创建的树节点出现一下,又消失,感觉没有创建成功。如果你刷新,这个新建节点还是很稳健的出现了,说明保存在库中了。删除节点、修改节点都是这样。于是对这三个action作如下修改:
def create @region = Region.create( :parent_region_id=>params[:id], :name=>params[:name], :creator_id=>current_user.id ) render :text =>"{\"id\":\"#{@region.id}\",\"status\":\"1\"}" end def update if Region.find(params[:id]).update_attributes(:name=>params[:name]) render :text => "{ \"status\" : 1 }" else render :text => "{ \"status\" : 0 }" end end def destroy region = Region.find(params[:id]) if region.child_regions.blank? if region.destroy render :text => "{ \"status\" : 1 }" else render :text=> "{ \"status\" : 0 }" end else flash[:notice] = "不能删除有子节点的节点" end end
增加了render代码,以符合json格式的方式,发送出去。
这些数据到了javascript前端;
3.需要在post这个ajax方法配置参数的时候,增加一个配置内容,即在function后面配置数据格式为“json”,前面遗漏了。下面是remove的代码,create、rename都需要这样做
.bind("remove.jstree", function (e, data) { $.post( "/admin/regions/destroy", { "id" : data.rslt.obj.attr("id") }, function (r) { if(!r.status) { $.jstree.rollback(data.rlbk); } }, 'json' ); });
这样增删改都可以了。