2

пытаются найти ответ на этот вопрос на некоторое время, решили, что стоит просить новую ...Рельсов 3 полиморфные маршрутизации

У меня есть несколько моделей, которые являются полиморфными, определяемыми как: class Transport, class Transport::Car < Transport, class Transport::Plane < Transport

у меня есть основание TransportController, а затем каждый тип Transport имеет соответствующий контроллер (все под Transport имен), т.е. Transport::CarController, Transport::PlaneController.

Я хочу, чтобы выяснить, как создать маршрут для различных 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, которые могут сделать код более сухим. Пример того, как я попытаюсь это сделать:

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, останутся специфичными для этого контроллера.

Смежные вопросы