10

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

我可以通过调用接近:

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

这给了我一组 Rack::Mount::Route 对象。

Route 对象唯一有用的属性是 :conditions ,它返回一个像这样的哈希:

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

如您所见,哈希值是匹配路由路径的正则表达式。我还可以使用 :named_captures 从正则表达式中获取所有命名的捕获:

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

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

4

6 回答 6

7

见这篇文章用葡萄耙路线

基本上你可以得到路线:

MyApi.routes

更新:

英文文章:葡萄宝石上的 rake routes 命令

于 2013-04-02T23:18:28.550 回答
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
于 2014-12-15T01:54:28.627 回答
2

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

您可以运行rake grape:routes并查看所有当前 API 及其详细信息(url、描述、版本)的格式正确的列表。

于 2016-03-21T10:21:21.713 回答
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

很好地打印出来。我正在处理截断,但如果你愿意,你当然可以摆脱它。

于 2014-02-26T08:27:16.187 回答
0

你不能这样做。一旦路线被编译,它就变得不那么容易检查了。不要对其进行逆向工程,请参阅https://github.com/intridea/grape/pull/48/

于 2011-07-29T13:44:03.017 回答
0

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

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

然而,它的附加值是 rails info 部分中的 html 表格视图http://localhost:3000/rails/info/routes_with_grape

于 2015-09-09T09:55:39.597 回答