2010-08-17 3 views
0

다음 경로가 있습니다. 코드 위rails3 routes issue

pota_on_k GET /pota/klass/:klass/:id(.:format)    
       {:action=>"show", :controller=>"pota/main"} 

은 레일 2.X에서 잘 작동 : 나는 레이크 경로를 수행 할 때

pota.resources :on_k, 
       :as => ':klass', 
       :path_prefix => 'pota/klass', 
       :controller => 'main' 

이 나는 ​​쇼 방법을 얻을 것입니다. 그러나 레일즈 3을 사용하고 있다면 다음과 같은 에러가 난다.

ActionController::RoutingError: No route matches 
{:action=>"show", :controller=>"pota/main", :klass=>"vehicle/door", :id=>1} 

나는 'vehicle/door'를 다음과 같이 전달하고 있음을 주목하라. klass => 'pet'와 같은 표준 모델을 통과하면 잘 작동합니다. 그러나 중첩 된 모델 이름을 전달하는 경우 : klass => 'vehicle/door'그러면 rails3에서 라우트 오류가 발생합니다.

내가 '/'값을 가지고 있기 때문에 그럴 것 같습니다. 나는 정규식을 가짐으로써 그것을 해결할 수있다. 그러나 나 또한 통과 할 수도있다 : 중첩되지 않은 klass. 자동차 : 자동차와 같은 클래스에

나는

Vehicle::Car.underscore #=> vehicle/car 
"vehicle/car".camelize.constantize #=> Vehicle::Car 

다른 쪽이 밑줄 및 camelize/constantize가 쉽게 중첩 된 클래스 이름을 전달 할 수 않습니다.

rails3을 수정하는 방법에 대한 아이디어가 있습니까?

답변

2

중지!

여기에 무슨 일을하고 있는지 생각해보십시오. URL 매개 변수에 대한 일정을 지정하지 않아야합니다. 결과에서 find를 호출한다고 가정하면 기본적으로 해커에게 응용 프로그램의 모든 ActiveRecord 모델을 쿼리하는 방법을 제공합니다.

더 좋은 방법은 동적으로 해킹 할 수없는 고정 경로를 구축하기 위해 메타 프로그래밍을 사용하는 것입니다 예 :

%w[pet vehicle/car vehicle/bike].each do |klass| 
    resources :pota, 
     :path => "pota/#{klass.pluralize}", 
     :as => "pota_#{klass.tr('/','_').pluralize}", 
     :defaults => { :klass => klass } 
    end 

그런 다음 당신은 URL을 생성 할 수있는 적절한 이름 경로 도우미를 호출하는 도우미 메서드를 추가 할 수 있습니다 전달 된 모델 인스턴스를 기반으로합니다.