在Grape / Rack :: Mount :: Route中访问已编译的路由

时间:2011-06-11 19:34:33

标签: ruby-on-rails rack ruby-1.9 grape-api

我正在尝试生成由我的Grape :: API(MyApi)子类生成的所有路由的列表。

我可以致电:

MyApi.send(:route_set).instance_variable_get(:@routes)

它给了我一个Rack :: Mount :: Route对象的数组。

Route对象唯一有用的属性是:返回Hash的条件:

 :path_info => (?-mix:\\A\\/api\\/(?<version>v1)\\/token(?:\\.(?<format>[^\\/]+))?\\Z)", "k: request_method, v: (?-mix:\\AGET\\Z)

正如您所看到的,散列的值是用于匹配路径路径的正则表达式。我也可以使用:named_captures从regexp获取所有命名的捕获:

{:path_info=>{:version=>0, :format=>1}, :request_method=>{}}

最终我要做的是生成通过Grape :: API创建的所有路由的列表,它们的完整路径等等。尝试在条件中解构regexp对我没有意义。是否有另一种方法可以访问/生成Rack :: Mount :: Route的人类可读路径?

6 个答案:

答案 0 :(得分:7)

请参阅此帖子rake routes with grape

基本上你可以获得路线:

MyApi.routes

更新:

英文文章:rake routes command on grape gem

答案 1 :(得分:2)

这里只是为答案添加另一个变体。我使用以下两个rake任务。

task :all_routes => [:routes, :api_routes]

task :api_routes => :environment do
  longest_uri  = MyAPI.routes.map{|api|api.route_path.length}.max
  longest_desc = MyAPI.routes.map{|api|api.route_description.length}.max
  pattern = "%10s %-#{longest_uri}s %-#{longest_desc}s\n"

  # print column headers
  printf(
    pattern,
    "Verb", "URI Pattern", "Description"
  )

  # print each column
  MyAPI.routes.each do |api|
    printf(
      pattern,
      api.route_method, api.route_path, api.route_description
    )
  end
end

答案 2 :(得分:2)

如果您使用带有导轨的葡萄,请查看grape_on_rails_routes宝石。

您可以运行rake grape:routes并查看格式正确的列表所有当前API及其详细信息(网址,说明,版本)。

答案 3 :(得分:1)

我是怎么做到的:

desc "Print out routes"
task :routes => :environment do
  StudyTube::API::V1::Base.routes.each do |route|
    info = route.instance_variable_get :@options
    description = "%-40s..." % info[:description][0..39]
    method = "%-7s" % info[:method]
    puts "#{description}  #{method}#{info[:path]}"
  end
end

很好地打印出来。我正在进行截断,但如果你想要的话,你可以摆脱它。

答案 4 :(得分:0)

你不能这样做。一旦路线被编译,它就变得不那么可检查了。请参阅https://github.com/intridea/grape/pull/48/

,而不是对其进行逆向工程

答案 5 :(得分:0)

如果没有运行Rails,我会使用其中一个自定义rake任务。 如果您实际上正在使用Rails,请查看grape-rails-routes gem

它为您提供了类似的佣金任务rake routes_with_grape

它的附加值是http://localhost:3000/rails/info/routes_with_grape

中rails视图部分中的html表视图