2011-02-14 2 views
10

Rails 3에 일반적인 가상의 URL 시스템을 구현하려고합니다. 허영 URL이 특정 모델에 묶여 있지 않다는 점에서 일반입니다. 그것은 내가 허영심의 모든 URL에서 치는 VanityUrlController을 가지고있는 장식물 보석과 비슷합니다. 차이점은 foo.com/username에서 foo.com/users/1 또는 foo.com/product-name에서 foo.com/products/1으로 외부 리디렉션을하고 싶지 않다는 것입니다. 허영심의 URL을 붙잡아서 VanityUrlContoller가 대응하는 show 액션을 모방 한 내부 리다이렉션을하도록하고 싶습니다.Rails 3를 사용하는 내부 리디렉션

내부 리디렉션을 보내려는 컨트롤러와 동작을 알고 있지만 실제로 디스패치하는 데 문제가 있습니다.

TargetController.new.process("show", request.env) 

새로운 처리를 시작하는 것 같다 "요청"하지만 실제 요청 객체와 같은 실종 키 조각 ...이 있습니다 : 나는 순간 나는 곳이다.

어떤 생각이나 조언을 주시면 감사하겠습니다.

업데이트 :

내가 더 나에게 조금 얻을 것 ActionController의 발송 방법을 가로 질러 달렸다.

TargetController.new.dispatch("show", request) 

나는이 두 가지 문제를 가지고 1)는 개인 API 방법으로 표시됩니다 차라리 그 좋겠, 2)가 쇼를 렌더링하는 경우에도,이 작업을 수행하는 또 다른 방법이 있다면 그렇게 템플릿을 TargetController에 대해 "누락 된 템플릿 vanity_urls/show"에 대해 불평합니다.

UPDATE 여기

우리가 함께했다 솔루션의 기본입니다. 우리는 인코딩을 강요하고 다른 특정 응용 프로그램을 확인하는 것과 같은 몇 가지 작업을 수행합니다.하지만이 작업을 수행하려면 모두 필요합니다.

이것은 routes.rb 파일의 맨 아래에 있습니다. 따라서 가상 경로가 다른 이름의 경로를 왜곡하지 않습니다.

# Vanity routes. 
match ':id', :as => 'vanity', :to => proc { |env| 
    id = env["action_dispatch.request.path_parameters"][:id] 

    vain_object = <method to find the object you want to display> 
    if vain_object.nil? 
    # render your 404 page 
    'application#404' 
    else 
    model = vain_object.class.model_name 
    # figure out the controller you want to go to 
    controller = [model.pluralize.camelize,"Controller"].join.constantize 
    # reset the :id parameter with the id of the object to be displayed 
    env["action_dispatch.request.path_parameters"][:id] = vain_object.id 
    # do your internal redirect 
    controller.action("show").call(env) 
    end 
} 

허영 경로를 만들 때 조심해야하므로 다른 컨트롤러와 충돌하지 않아야합니다. 에 대해 알아야 할 유용한 사항은 다음과 같습니다 당신의 vanity_url은 현재 컨트롤러와 동일한 이름을 가진 경우를 알려줍니다

Rails.application.routes.routes.any? { |r| r.requirements[:controller] == vanity_url } 

.

Rails.application.routes.recognize_path("/#{vanity_url}", :method => :get) 

이것은 어떤 것이 이미 매핑되어 있는지 알려줍니다.

물론, 길을 따라 몇 가지 해킹이 있지만 매력처럼 작동합니다.

+0

여기에 추출 된 람다 및 제약 조건이 적용된 유사한 옵션이 있습니다. http://stackoverflow.com/questions/5641786/testing-rack-routing-using-rspec – Agustin

답변

관련 문제