【问题标题】:How to get a list of all routes used in a Sinatra app?如何获取 Sinatra 应用程序中使用的所有路线的列表?
【发布时间】:2012-11-21 13:21:44
【问题描述】:

说我有:

require 'sinatra'

get '/' { "hi" }
get '/a' { "a" }
get '/b' { "b" }

有什么简单的方法可以在我的 Sinatra 应用程序中获取所有已定义路由的列表吗?

我调查了Sinatra::Base.routes,但这似乎不包含我刚刚定义的路线。

我希望有一个很好的方法来制作像routes.each { |r| p r } 这样的自我记录 API 来获得:

/
/a
/b

【问题讨论】:

    标签: routes sinatra


    【解决方案1】:

    您应该调查包含您的路线的Sinatra::Application.routes。这将打印您的路由模式的正则表达式:

    require 'sinatra'
    
    get '/'  do "root" end
    get '/a' do "a" end
    get '/b' do "b" end
    
    Sinatra::Application.routes["GET"].each do |route|
      puts route[0]
    end
    

    为了让事情更简单,看看sinatra-advanced-routes 扩展。它为您提供了一个很好的 API 用于内省路由:

    require 'sinatra'
    require 'sinatra/advanced_routes'
    
    get '/'  do "root" end
    get '/a' do "a" end
    get '/b' do "b" end
    
    Sinatra::Application.each_route do |route|
      puts route.verb + " " + route.path
    end
    

    有关更多文档和示例,请参阅 sinatra-advanced-routes 的 README。

    【讨论】:

    • 谢谢!这解释了我从中获得@routes 的 Sinatra::Application.instance_variables 部分。还有 [:@conditions, :@routes, :@filters, :@errors, :@middleware, :@prototype, :@extensions, :@templates] 虽然我还没有理解如何使用它们。也许我应该问一个问题?
    【解决方案2】:

    这是一个输出路由列表的 rake 任务:

    desc 'List defined routes'
    task :routes do
      require 'app/web/web'
    
      Shoebox::Server.routes.map do |method, routes|
        routes.map { |r| r.first.to_s }.map do |route|
          "#{method.rjust(7, ' ')} #{route}"
        end
      end.flatten.sort.each do |route|
        puts route
      end
    end
    

    输出:

        GET /asset/:id
       HEAD /asset/:id
       POST /asset/:aggregate_id/provide
    OPTIONS /asset
    

    【讨论】:

      猜你喜欢
      • 2021-07-31
      • 1970-01-01
      • 2011-04-10
      • 2011-01-04
      • 1970-01-01
      • 2011-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多