2013-03-28 2 views
4

Ruby on Rails에 API를 작성했으며 사용할 수있는 모든 경로를 나열하는 페이지가 하나 있습니다 (이 방법은 rake routes을 사용하여 명령 줄을 통해 수행 할 수 있음을 알고 있습니다).보기/컨트롤러의 경로 표시

코드를 업데이트 할 때마다 직접 업데이트하지 않고 자동으로 생성하려고합니다. 컨트롤러 (또는 뷰)의 모든 경로 목록을 가져 오는 방법이 있습니까?

+0

+1 정답으로이 질문을 찾고 있습니다. – Vinay

답변

2

레이크 루트에 대한 레이크 작업을 구현하는 방법을 살펴볼 수 있습니다. lib/rails/tasks/routes.rake 안에있는 레일 티 보석에서 찾을 수 있습니다. 나는 그것이 RouteInspector should not be used 것을 언급 한 문서에 jvnill에 의해 주어지고있는 솔루션을 탐구하기 시작

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 새로운 컨트롤러와 액션을 만들었습니다 (레일즈 컨트롤러 루트를 보여줍니다). 라우트 파일에 라우트를 추가했습니다. 위의 대답에서 컨트롤러의 3 번째 줄을 추가했지만 변수 앞에 @ 기호를 넣고보기에서 마지막 세 줄을 '<%'태그 사이에 넣습니다. – chrisbulmer

3

하지만 쉽게하기 위해, 여기있다. 어떤 이유인지 모르겠지만 코드를 살펴보고 단순한 문자열이 아닌보다 유용한 출력을 얻으려고합니다. 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