Объединение мелких и неглубоких маршрутов на одном ресурсе Rails - PullRequest
2 голосов
/ 30 июля 2011

Допустим, у меня есть 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 к обработке изменений вида? Все остальные коды вида идентичны.

Ответы [ 2 ]

2 голосов
/ 30 июля 2011

Я хочу, чтобы пользователь мог ограничить свой поиск изнутри контекст данного журнала, или искать все объявления независимо от родителя Журнал, потому что некоторые объявления не будут иметь родительских журналов

У вас есть две разные проблемы здесь. Я хотел бы предложить вам два разных контроллера для этих двух проблем. Один, конечно, входит в контекст журнала, а другой - в качестве автономного контроллера (AD, у которого нет родительского журнала).

Таким образом, у вас есть два разных контроллера с четко разделенными задачами.

resources :ads do
  get 'search', :action => :search, :on => :collection
end
resources :magazines do 
  resources :ads, :shallow => true do
    get 'search', :action => :search, :on => :collection
  end
end
0 голосов
/ 13 декабря 2013

Вы можете использовать один вызов url_for для генерации любого маршрута (через polymorphic_url).

url_for [:search, @magazine, :ads]
# when @magazine is present, this is equivalent to search_magazine_ads_url
# when @magazine is nil, it's search_ads_url

url_for [:new, @magazine, :ad] #=> new_magazine_ad_url or new_ad_url
url_for [@magazine, :ads] #=> magazine_ads_url or ads_url

Вы даже можете передать массив в link_to вместо маршрута, сгенерированного именованным помощником.

link_to 'New Ad', [:new, @magazine, :ad]

http://apidock.com/rails/ActionDispatch/Routing/PolymorphicRoutes

...