2

잠시 동안이 질문에 대한 답을 찾기 위해 노력하고, ... 그것은 새로운 하나를 물어 가치가 있었다레일 3 다형성 라우팅

을 결정 나는이 다음과 같이 정의 다형성있는 여러 모델 : class Transport, class Transport::Car < Transport, class Transport::Plane < Transport

Transport::PlaneController, Transport 모든 유형 (모든 공간 Transport 이하) 대응하는 컨트롤러가 예를 Transport::CarController 후 염기 TransportController하고있다.

내가 다른 Transport 행동에 대한 라우팅을 만드는 방법을 알아 내야 할 ...

  • 내가 (이것이의 일환으로 수행해야합니다 얼마나 많은 Transport 하위 클래스 사전을 모르는 데이터베이스 호출을 통한 초기화 프로그램).
  • Transport마다 두 개의 공유 컨트롤러 동작이 있습니다 (#board#depart). 이러한 메서드는 TransportController 안에 있어야하며, 이는 전송 유형에 관계없이 동일한 동작을 수행하고 동일한 뷰를 표시하기 때문입니다.
  • 다른 Transport 유형은 고유 한 조치의 다른 구현을 가질 수 있습니다. 예를 들어 자동차와 비행기의 경우 #choose_seat은 다른 제한 조건과 다른보기에 따라 다르지만 동작은 동일합니다.
  • 다른 Transport 유형에는 고유 한 조치가 부여됩니다. 예를 들어 Transport::PlaneController#landing_gear_up 동작을 가져야하지만 Transport::CarController의 경우에는 의미가 없습니다. 나는이 느낌

    # for an action landing_gear_up only inside plane 
    match '/transport/plane/landing_gear_up', 
         :controller => "Transport::PlaneController", 
         :action => "landing_gear_up" 
    
    # for an action on every transport type that are handled differently 
    match '/transport/:type/choose_seat', 
         :controller => "Transport::<type>Controller", 
         :action => "choose_seat" 
    
    # for the actions that are handled commonly across every type of transport 
    match '/transport/:type/board', :to => "transport#board" 
    match '/transport/:type/depart', :to => "transport#depart" 
    

    "동적 세그먼트"로 할 수 있어야하지만 그것이 제대로 작동하려면 얻을 관리 할 수 ​​없습니다 :

내가 좋아할만한 것은 같은 라우팅 파일입니다. 어떤 제안?

답변

1

routes.rb에 메소드와 변수를 정의하면 코드가 더 DRY가 될 수 있습니다. 내가 어떻게하려고하는지 예 :

Your::Application.routes.draw do 
    ## other routes 

    ## helper method to define transport route 
    def route_transport action, types 
    match "/transport/:type/#{action}", :to => "transport##{action}" and return if types == :common 
    [types].flatten.each { |t| match "/transport/#{t}/#{action}", :controller => "Transport::#{t}Controller", :action => action } 
    end 

    { 
    :board => :common, 
    :depart => :common, 
    :landing_gear_up => :plane, 
    :choose_seat => [:car, :plane], 
    # action name => :common or transport type(s) 
    }.each { |action, types| route_transport action, types } 

    ## other routes 
end 

코드를 검사하지 않았으므로 오류가있을 수 있습니다. rake routes을 실행하여 올바른 경로가 생성되는지 확인하십시오.

또한 RESTful routes을 살펴보세요. 장기적으로 쉽게 사용할 수 있습니다.

0

컨트롤러에서 상속 계층 구조가 동일한 경우 특별한 작업을 수행 할 필요가 없습니다. 리소스를 선언하고 각 컨트롤러에 대해 비 RESTful 경로를 선언하면 완료됩니다. PlaneController # 보드는 자동으로 TransportController # 보드를 호출합니다. PlaneController에만 해당하는 작업은 해당 컨트롤러에만 적용됩니다.