Просто измените ваши маршруты следующим образом:
map.resources :vehicles, :has_many => :suppliers,
:collection => { :trucks => :get }
И проверьте rake routes
для маршрутов, которые это генерирует. Это позволит вам перечислить транспортные средства, которые являются грузовыми автомобилями:
trucks_vehicles GET /vehicles/trucks(.:format)
{:controller=>"vehicles", :action=>"trucks"}
Так что теперь вам просто нужно добавить новое действие под названием «грузовики», которое работает подобно «index». Формы должны отслеживать самостоятельно (через поля формы), если вы создаете грузовик или другое транспортное средство. Не пытайтесь обойтись с маршрутизацией рельсов, что, как правило, означает, что дизайн вашего приложения имеет недостатки, что впоследствии приведет к неприятностям.
Вы можете взглянуть на STI (наследование одной таблицы: одна таблица хранит несколько классов транспортных средств). Другой способ - создать контроллер грузовых автомобилей, который наследует от контроллеров транспортных средств и перезаписывает только некоторые методы, например:
class TrucksController < VehiclesController
def new
@is_truck = true
super
end
...
end
или
class TrucksController < VehiclesController
before_filter :this_is_a_truck
...
private
def this_is_a_truck
@is_truck = true
super
end
end
Обновление: Вот еще один (если у вас есть столбец is_truck):
class TrucksController < VehiclesController
around_filter :with_truck_scope
...
private
# Scope every active record access with an is_truck condition
# you may want to put this directly into the model to get rid of the .send
# method and directly access "Vehicle.with_truck_scope &block" here
def with_truck_scope(&block)
Vehicle.send :with_scope, :find => { :conditions => "is_truck = 1" },
:create => { :is_truck => 1 }, &block
end
end
Но я действительно рекомендую сначала попробовать параметры :collection
и :member
маршрутизации Rails.