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)
이것은 어떤 것이 이미 매핑되어 있는지 알려줍니다.
물론, 길을 따라 몇 가지 해킹이 있지만 매력처럼 작동합니다.
여기에 추출 된 람다 및 제약 조건이 적용된 유사한 옵션이 있습니다. http://stackoverflow.com/questions/5641786/testing-rack-routing-using-rspec – Agustin