我正在尝试生成由我的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的人类可读路径?
答案 0 :(得分:7)
答案 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