2011-06-11 103 views
9

訪問已編譯的路由我試圖生成由我的Grape :: API(MyApi)的子類生成的所有路由的列表。葡萄/ Rack :: Mount :: Route

我可以通過調用親近:

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

這給了我機架安裝:: ::路由對象的數組。

路由對象,它是有用的唯一屬性是:它返回一個哈希這樣的條件:

: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=>{}} 

最後我想要做的是通過生成葡萄創建的所有路由列表:: API,它們的完整路徑,等等。在條件下嘗試解構正則表達式對我來說沒有任何意義。是否有另一種訪問/生成Rack :: Mount :: Route的可讀路徑的方法?

回答

7

看到這個職位rake routes with grape

basicaly你可以得到的路線有:

MyApi.routes 

UPDATE:

英文文章:rake routes command on grape gem

+0

該鏈接已關閉,並且它是一個.xxx域?嗯 – 2014-02-20 11:51:14

+1

是的@sardaukar,但你可以在這裏http://hermes-vertigem.herokuapp。com/2013/04/02/rake-routes-no-grape /我修復了答案,Thankx – Duke 2014-02-26 01:43:18

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 

很好地打印出來。我正在削減截斷,但如果你想要的話,你可以擺脫它。

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 
0

如果不運行Rails,我會使用其中一個自定義Rake任務。 如果您實際上使用Rails,請查看grape-rails-routes gem

它給你一個類似的耙子任務rake routes_with_grape。然而

它的附加值是如果你使用的是帶有護欄的葡萄,檢查出grape_on_rails_routes寶石在軌信息科​​

2

HTML表視圖。

您可以運行rake grape:routes並查看格式良好的所有當前API及其詳細信息(url,description,version)。

+0

雖然這個鏈接可能回答這個問題,但最好在這裏包含答案的基本部分,並提供參考鏈接。如果鏈接頁面更改,則僅鏈接答案可能會失效。 - [來自評論](/ review/low-quality-posts/11712383) – RickyA 2016-03-21 10:48:01

+0

@RickyA感謝您的反饋,只是更新了答案! – 2016-03-21 11:55:28

+0

此方法更好,因爲它不基於項目名稱,而是通過ObjectSpace搜索從Grape :: API繼承的所有內容。 – 2016-03-29 11:28:44