Доступ к скомпилированным маршрутам в Grape / Rack :: Mount :: Route - PullRequest
9 голосов
/ 11 июня 2011

Я пытаюсь создать список всех маршрутов, созданных моим подклассом Grape :: API (MyApi).

Я могу подойти, позвонив по телефону:

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

, который дает мне массив объектов Rack :: Mount :: Route.

Единственный полезный атрибут объекта Route: условия, которые возвращают хэш, например:

 :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?

Ответы [ 6 ]

7 голосов
/ 03 апреля 2013

См. Этот пост маршруты рейка с виноградом

в основном вы можете получить маршруты с:

MyApi.routes

ОБНОВЛЕНИЕ:

Статья на английском языке: команда rake routs на виноградной жемчужине

2 голосов
/ 21 марта 2016

Если вы используете виноград с рельсами, посмотрите grape_on_rails_routes камень.

Вы можете запустить rake grape:routes и увидеть красиво отформатированный список всех текущих API и их детали (URL, описание, версия).

2 голосов
/ 15 декабря 2014

Просто чтобы добавить еще один вариант ответов здесь. Я использую следующие два рейк-задания.

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
1 голос
/ 26 февраля 2014

Как я это сделал:

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

Хорошо распечатывает их. Я возился с усечением, но вы можете избавиться от этого, если хотите, конечно.

0 голосов
/ 09 сентября 2015

Я бы пошел с одной из пользовательских задач рейка, если бы не запускал Rails. Если вы действительно используете Rails, взгляните на гем grape-rails-routs .

Это дает вам аналогичное задание по рейку rake routes_with_grape.

Однако добавленной стоимостью является представление таблицы html в разделе информации о рельсах на http://localhost:3000/rails/info/routes_with_grape

0 голосов
/ 29 июля 2011

Вы не можете сделать это. Как только маршрут составлен, он становится намного менее инспектируемым. Вместо обратного инжиниринга, см. https://github.com/intridea/grape/pull/48/.

...