论坛首页 编程语言技术论坛

怎么方便的遍历整个app里面的controllers,和actions

浏览 4782 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2007-04-05  

我想给我自己写的系统加入基于角色的权限管理

用的是rails recipes 里面推荐的方法 32号

把所有的controllers里面的actions放到一张rights里面

但是构建rights表的时候难道要手动 把 controller 名字以及 action的名字一个一个复制到表里面去?
而且以后controllers actions增加我也不用太麻烦

有没有简便点的办法让我可以通过irb 构造这张表?

类似
theapp.controllers.each do |contoller|
  controller.actions.each do |action|
    Right.create(:controller=> controller.name,:action=> action.name)
  end
end
   发表时间:2007-04-05  
自己写个脚本扫描Controller目录下所有文件,用正则提取下文件名和action名,转换下大小写不就可以了嘛,自己动手写写:)
0 请登录后投票
   发表时间:2007-04-05  
我试着写了下,应该可以了

 @controllers=Hash.new
      path="#{RAILS_ROOT}/app/controllers/"
      Dir.new(path).entries.each do |f|
         if !f.index('.rb').nil? and f.index('.rb')>0
        
         controller=File.open(path+f.to_s)
         s=controller.read
         /class\s(.*)\s\</.match(s)
         controller_name=$1.to_s
         actions=[]
         s.scan(/def\s(.*)\s/).each{ |action| actions<<(action[0]) }
         @controllers[controller_name]=actions
         controller.close
         end
      end
      
       @controllers.each_pair do |name, actions|
          actions.each do |action| 
          Right.create(:controller=>name,:action=> action)  
          end
       end
0 请登录后投票
   发表时间:2007-04-06  
it works !

俺正则表达式不熟,又是一个学习的机会


谢谢dennis_zane朋友
0 请登录后投票
   发表时间:2007-04-06  
修改了一下 把controller 的controller_path 取出来,并且直接使用的action_methods来取得所有的actions

贴一下完整的代码文件放在scripts目录下面 addrights.rb

require File.dirname(__FILE__) + '/../config/boot'
require File.dirname(__FILE__) + '/../config/environment'
#加载rails环境,主要是model

controllers = Array.new
path="#{RAILS_ROOT}/app/controllers/"
Dir.new(path).entries.each do |f|
  if !f.index('.rb').nil? and f.index('.rb')>0

    require  path+f.to_s
#所有controllers没有自动加载,这里手动加载一下
    controller=File.open(path+f.to_s)
    s=controller.read
    /class\s(.*)\s\</.match(s)
    controller_name=$1.to_s
    controllers << controller_name
  end
end
controllers.each {|c| puts c}

controllers.each do |name|
  (eval(name)).action_methods.each do |action| 
    Right.create(:controller=>(eval(name)).controller_path,:action=> action)
  end
end
#调用controller类的controller_path和action_methods,数据更准确一些
0 请登录后投票
   发表时间:2007-04-06  
danoyang 写道
修改了一下 把controller 的controller_path 取出来,并且直接使用的action_methods来取得所有的actions

贴一下完整的代码文件放在scripts目录下面 addrights.rb

require File.dirname(__FILE__) + '/../config/boot'
require File.dirname(__FILE__) + '/../config/environment'
#加载rails环境,主要是model

controllers = Array.new
path="#{RAILS_ROOT}/app/controllers/"
Dir.new(path).entries.each do |f|
  if !f.index('.rb').nil? and f.index('.rb')>0

    require  path+f.to_s
#所有controllers没有自动加载,这里手动加载一下
    controller=File.open(path+f.to_s)
    s=controller.read
    /class\s(.*)\s\</.match(s)
    controller_name=$1.to_s
    controllers << controller_name
  end
end
controllers.each {|c| puts c}

controllers.each do |name|
  (eval(name)).action_methods.each do |action| 
    Right.create(:controller=>(eval(name)).controller_path,:action=> action)
  end
end
#调用controller类的controller_path和action_methods,数据更准确一些


原来controller还有这么两个方法,受教
0 请登录后投票
论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics