Допустим, у меня есть Magazine
модель и Ad
модель, такая что Magazine :has_many => :ads
. Я настроил мою маршрутизацию вложенных ресурсов следующим образом:
resources :magazines do
resources :ads, :shallow => true do
get 'search', :action => :search, :on => :collection
end
end
Моя цель - получить доступ к маршрутам CRUD по умолчанию, созданным ресурсами Rails, а также к поисковому маршруту как на вложенном, так и на мелком уровне. Я хочу, чтобы пользователь мог ограничить свой поиск из контекста данного журнала или выполнить поиск по всем объявлениям независимо от родительского журнала, поскольку некоторые объявления не имеют родительских журналов. Другими словами, я хочу иметь возможность:
/magazines/1/ads/new
/ads/new
/magazines/1/ads/search
/ads/search
# ... all standard CRUD routes ...
Меня беспокоит то, что переменные пути в представлениях зависят от таких вещей, как new_magazine_ad_path(@magazine)
. Разве доступ к маршруту, подобному /ads/index
(который должен содержать ссылку для создания нового объявления), не прервется при встрече с помощником new_magazine_ad_path(@magazine)
без какого-либо экземпляра @magazine
, который бы направлял его?
P.S .:
Обычно я сам пробовал бы все это, чтобы увидеть, что сработало, но я застрял прямо сейчас с вышеуказанной настройкой - я могу только редактировать, удалять, показывать и обновлять мелкие маршруты:
/ads/:id
/ads/:id/edit
/ads/:id (put)
/ads/:id (delete)
и нет новых или индексных маршрутов:
/ads/index
/ads/new
Обновление
Итак, Шрейас предложил создать два контроллера, один для обработки вложенного объявления, а другой для обработки мелкого объявления. Это имеет смысл, но это оставляет меня дублировать весь код представления только для того, чтобы изменить помощники пути с magazine_ad_path(@magazine)
на ad_path
. Есть какие-нибудь идеи относительно подхода DRY'er к обработке изменений вида? Все остальные коды вида идентичны.