Ruby on rails Rails 3:以编程方式获取命名空间中的路由列表 问题:

Ruby on rails Rails 3:以编程方式获取命名空间中的路由列表 问题:,ruby-on-rails,ruby-on-rails-3.2,routes,Ruby On Rails,Ruby On Rails 3.2,Routes,如何获得Admin名称空间中所有路由的列表,以便在某个测试中使用它 根本原因 在我的Admin命名空间中创建新控制器时,我经常犯从ApplicationController继承而不是从AdminController继承的错误。因此,我想编写一个测试,访问我Admin命名空间中的所有路由,并验证每个路由都需要一个登录用户。test\u routes=[] test_routes = [] Rails.application.routes.routes.each do |route| rout

如何获得
Admin
名称空间中所有路由的列表,以便在某个测试中使用它

根本原因 在我的
Admin
命名空间中创建新控制器时,我经常犯从
ApplicationController
继承而不是从
AdminController
继承的错误。因此,我想编写一个测试,访问我
Admin
命名空间中的所有路由,并验证每个路由都需要一个登录用户。

test\u routes=[]
test_routes = []

Rails.application.routes.routes.each do |route|
  route = route.path.spec.to_s
  test_routes << route if route.starts_with?('/admin')
end
Rails.application.routes.routes.each do| route| route=route.path.spec.to_s
test_routes如果其他人想测试名称空间中的所有路由是否需要登录用户,我是这样完成的:

ROUTES = Rails.application.routes.routes.map do |route|
  # Turn route path spec into string; use "1" for all params
  path = route.path.spec.to_s.gsub(/\(\.:format\)/, "").gsub(/:[a-zA-Z_]+/, "1")
  verb = %W{ GET POST PUT PATCH DELETE }.grep(route.verb).first.downcase.to_sym
  { path: path, verb: verb }
end

test "admin routes should redirect to admin login page when no admin user is logged in" do
  admin_routes = ROUTES.select { |route| route[:path].starts_with? "/admin" }
  unprotected_routes = []

  admin_routes.each do |route|
    begin
      reset!
      request_via_redirect(route[:verb], route[:path])
      unprotected_routes << "#{route[:verb]} #{route[:path]}" unless path == admin_login_path
    rescue ActiveRecord::RecordNotFound
      unprotected_routes << "#{route[:verb]} #{route[:path]}" unless path == admin_login_path
    rescue AbstractController::ActionNotFound
    end
  end

  assert unprotected_routes.empty?,
    "The following routes are not secure: \n\t#{unprotected_routes.uniq.join("\n\t")}"
  end
end
ROUTES=Rails.application.ROUTES.ROUTES.map do | route|
#将路由路径规范转换为字符串;对所有参数使用“1”
path=route.path.spec.to_.gsub(/\(\:format\)/,“”).gsub(/:[a-zA-Z_]+/,“1”)
verb=%W{GET POST PUT PATCH DELETE}.grep(route.verb).first.downcase.to_sym
{path:path,verb:verb}
结束
测试“当没有管理员用户登录时,管理员路由应重定向到管理员登录页面”do
admin|routes=routes。选择{| route | route[:path]。以?/admin“}开头
未受保护的_路由=[]
管理|路线。每个do |路线|
开始
重置!
通过重定向请求(路由[:动词],路由[:路径])

未受保护的路由尝试运行rake路由……。它会提供您在应用程序中定义的所有路由。我正在尝试在测试中使用路由列表,因此
rake路由
对我不起作用。我需要能够在代码中操作列表。如果您愿意,这可以是一行:
admin_routes=Rails.application.routes.routes.select{route}route.path.spec.to_.start_with?/admin}
我更愿意在使用的控制器上进行筛选,结果是:
Rails.application.routes.routes.select{route}route}route.defaults[:controller]='admin'&&route.verb=~'GET'}
(对请求类型也进行过滤)。您还可以抓取
routes.spec
并调用
。每个
都在树中循环。如果您按
文本?
进行过滤,则将获得路由的所有文本部分,这通常是我需要的。