Отрицательное ограничение регулярного выражения в маршрутах Rails 3

У меня есть несколько объявлений об аренде, которые я хочу сделать доступными как ресурс RESTful, но также иметь фильтрацию индекса с помощью параметра :area, который может быть районом или регионом. Учитывая ресурс «аренда», я хотел бы иметь

/rentals

а также фильтрация параметров :area на корневом уровне

/downtown
/westside
/some-neighborhood
etc.

Я подумал, что смогу заставить это работать, поместив следующее в конец файла маршрутов:

resources :rentals
get ':area' => 'rentals#index', :area => /[a-zA-Z0-9\-]+/, :as => :area

Но когда я добавлял Kaminari для разбивки на страницы, он автоматически генерировал ссылки на страницы, чтобы они выглядели примерно так:

/rentals?area=downtown&page=2

когда я предпочел бы, чтобы это выглядело как

/downtown?page=2

Чтобы заставить Kaminari использовать версию именованного маршрута, параметр :area должен иметь приоритет, поэтому я изменил маршруты на:

get ':area' => 'rentals#index', :area => /(?!rentals)[a-zA-Z0-9\-]+/, :as => :area
resources :rentals

Но когда я пытаюсь распознать маршрут в консоли, я получаю:

ActionController::RoutingError: No route matches {:controller=>"rentals", :area=>"downtown"}

Я не уверен, как подойти к решению этой проблемы, поэтому любая помощь будет оценена по достоинству.


person cotopaxi    schedule 05.06.2011    source источник


Ответы (1)


Вы можете использовать лямбда-выражения в ограничениях маршрута, чтобы решить эту проблему.

match ':area' => 'rentals#index', :constraints => lambda{|req|  !req.env["REQUEST_URI"].include? "rentals"}
person David Burrows    schedule 08.07.2011
comment
Это сработало для меня, но мне пришлось добавить круглые скобки к вызову .include? - person kelly.dunn; 17.01.2012