2010-08-09 3 views
1

Вот моя дилемма: у меня есть два типа маршрутов, которые семантически очень разные и должны идти на разные контроллеры.Обработка неоднозначных маршрутов в Rails

ny/new-york/brooklyn/cleaners # should go to a list of cleaners for a neighborhood 
ny/new-york/cleaners/mrclean # should go to an individual cleaner's page 

Обратите внимание, что «броклины» и «чистящие средства» здесь являются лишь примерами. Приложение имеет множество типов услуг (например, «очиститель») и многие окрестности, поэтому невозможно жестко закодировать список либо в регулярное выражение, и использовать его для различения двух маршрутов.

Можно ли использовать произвольный метод, который обращается к моделям ActiveRecord, в решении о маршрутизации? Я использую Rails 2.3.8.

ответ

5

Edit: новый ответ динамичными услуг

Глядя на эту blog entry представляется возможным использовать ActiveRecords на маршрутах.

Может быть, вы могли бы сделать что-то вроде этого:

service_names = Service.all.map(&:short_name) # assuming the property 'short_name' is the value used in urls 
service_names.each do |service_name| 
    map.connect ':state/:city/#{service_name}/:company' :controller => ‘company’, :action => ‘show’ # to show the company's page 
    map.connect ':state/:city/:neighborhood/#{service_name}_finder' :controller => ‘company_finder’, :action => ‘find’ # to list the companies for the given service in a neighborhood 
end 

Это все еще должно предотвратить конфликты с момента маршрутов для определенного сервиса является перед маршрутом для окрестностей


Старого плохой ответ

Не можете ли вы использовать два следующих маршрута?

map.connect ':state/:city/cleaners/:cleaner' :controller => ‘cleaners’, :action => ‘show’ # to show the cleaner's page 
map.connect ':state/:city/:neighborhood/cleaners' :controller => ‘cleaner_finder’, :action => ‘find’ # to list the cleaners of a neighborhood 

В контроллере, вы должны быть в состоянии восстановить: состояние,: город и другие значения с использованием Params [: состояния], [Params: город] и т.д.

Если собрать: состояние /: город/уборщики /: уборщик на первой линии должен предотвращать двусмысленность.

+1

+1. Nitpick: По какой-то причине они должны использовать разные контроллеры. – alternative

+0

Исправлено, спасибо. – David

+0

Примечание: «Приложение имеет множество типов обслуживания (например,« очиститель »), поэтому я не могу их жестко закодировать, как вы это сделали с помощью« чистящих средств ». – lawrence

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