2013-03-28 3 views
4

Я написал API в Ruby on Rails, и хочу иметь одну страницу, в которой перечислены все доступные маршруты (я знаю, что это можно сделать через командную строку, используя rake routes).Показывать маршруты в представлении/контроллере

Я хочу сгенерировать это автоматически, а не обновлять его сам, когда я обновляю код. Есть ли способ получить список всех маршрутов в контроллере (или в представлении)?

+0

+1 Я ищу этот вопрос с правильным ответом. – Vinay

ответ

2

Вы можете взглянуть на то, как реализована задача рейка для рейк-маршрутов :) Она найдена в жгуте рядов внутри lib/rails/tasks/routes.rake. Но, чтобы сделать его проще, здесь

task :routes => :environment do 
    Rails.application.reload_routes! 
    all_routes = Rails.application.routes.routes 

    require 'rails/application/route_inspector' 
    inspector = Rails::Application::RouteInspector.new 
    puts inspector.format(all_routes, ENV['CONTROLLER']).join "\n" 
end 
+0

Работает отлично. Благодаря! – chrisbulmer

+0

@chrisbulmer Привет. Я новичок и ищу объясненный ответ для этого. Как вам удалось создать отдельную страницу для отображения всех маршрутов? – Vinay

+1

@Vinay Создал новый контроллер и действие (используйте маршруты маршрутов rails g), а затем добавил маршрут для него в файле маршрутов. Я добавил третью строку в ответе выше в контроллере, но поставил символ @ перед переменной, и в представлении я помещал последние три строки до конца между «<%» тегами – chrisbulmer

3

Я начал исследовать решение, данное jvnill и найти в документации он заявил, что RouteInspector should not be used. По какой причине я не знаю, но я решил посмотреть на код и попробовать и получить более полезный вывод, а не просто строки. Я использовал код jvnill в качестве отправной точки.

all_routes = Rails.application.routes.routes 
routes = all_routes.routes.collect do | route | 
    reqs = route.requirements 

    controller = reqs[:controller] || ':controller' 
    action = reqs[:action] || ':action' 

    constraints = reqs.except(:controller, :action) 

    verb = route.verb.source.gsub(/[$^]/, '') 

    {name: route.name.to_s, verb: verb, path: route.path.spec.to_s, reqs: reqs} 

end 

routes.reject! { |r| r[:path].starts_with?("/rails/info/properties") || r[:path] == "#{Rails.application.config.assets.prefix}" } 

routes затем содержит хэш, содержащий имя маршрута, пути и контроллера и действия.

+0

Хороший Крис. Извините за поздний ответ. Я был вне станции. Я попробовал ваш код и получил одну и ту же страницу. – Vinay

Смежные вопросы