2009-06-29 4 views
6

레일 컨트롤러 또는 뷰의 범위 내 : 레일스 라우팅 메커니즘을 쿼리하여 상대 URL 문자열을 설정할 수 있습니다 (예 : 컨트롤러의 "/ controllername/action/whatever"). 이 클래스는 요청을 처리 할 책임이 될 것주어진 컨트롤러 문자열을 확인하는 방법

나는 이런 식으로 뭔가를하고 싶어?. contorllerClass이 클래스의 인스턴스

controllerClass = someMethod("/controllername/action/whatever") 

내가 어떤 가정을하고 싶지 않아 경로 정보 대회 예. 위의 예제에서 "controllername"은 항상 컨트롤러의 이름입니다 (그렇지 않기 때문에).

답변

11

함께 솔루션을 찾을 수 있다고 생각 카를로스에서 빌딩 :

path = "/controllername/action/whatever" 
c_name = ActionController::Routing::Routes.recognize_path(path)[:controller] 
controllerClass = "#{c_name}_controller".camelize.constantize.new 

은 컨트롤러 클래스의 새로운 인스턴스를 제공 할 것입니다.

+0

터무니을! SO가 '대답이 게시되었습니다.'라고 말하면 19 분이 지났습니다. 정답은 +1입니다. – Swanand

+2

Rails 3.2.x에 적용되지 않습니다 : ( – Nowaker

+2

은 이제 Rails에 있습니다. application.routes.recognize_path()', 그런데. –

0

더 좋은 방법이 있는지 모르겠지만 레일스의 코드를 살펴 보려고합니다.

라우팅 클래스에는 테스트에 사용되는 몇 가지 단정 방법이 있습니다. 경로와 예상 컨트롤러를 가져 와서 올바르게 라우트한다고 단정합니다.

거기에 좋은 시작이 있어야합니다.

http://api.rubyonrails.org/classes/ActionController/Assertions/RoutingAssertions.html#M000598

특히이 줄을하는 데 도움이

generated_path, extra_keys = ActionController::Routing::Routes.generate_extras(options, defaults) 

희망.

편집 :

나는 반대의 예를 지적했습니다.

당신은 경로 => CONTROLER/액션 그리고

당신이

http://api.rubyonrails.org/classes/ActionController/Assertions/RoutingAssertions.html#M000597

방법 중 하나를 보라 원하거나 또 다른 나는 당신이 그 라인 :

1

ActionController::Routing::Routes.recognize_path "/your/path/here"

인쇄겠습니까 :

{:controller=>"corresponding_controller", :action=>"corresponding_action" } # Plus any params if they are passed

관련 문제