Я пытаюсь написать универсальный маршрут в Rails 3, но хочу зарезервировать в нем некоторые термины. Я специально следую примеру, приведенному в этом посте в ответе Дэвида Берроуза: Динамические маршруты с Rails 3
Я использую следующий синтаксис:
match '*path' => 'router#routing', :constraints => lambda{|req| (req.env["REQUEST_PATH"] =~ /(users|my-stuff)/).nil? }
Теперь этот синтаксис работает просто отлично - если пользователь заходит на страницу с «user» или «my-stuff» в пути, он падает через всеобщее обозрение и попадает в определенное место. Если пользователь переходит на любой другой URL, он переходит к моей логике маршрутизации.
Мой вопрос больше о читабельности - есть ли способ сопоставить маршрут с чем-то другим , чем с регулярным выражением? Есть ли способ предоставить массив терминов для сопоставления? Кроме того, есть ли способ сопоставить определенные сегменты маршрута, в отличие от всего этого?
Очевидно, что в Rails есть встроенная маршрутизация, но в этом проекте есть требование, чтобы для определенных маршрутов контроллер не присутствовал в URL. Отсюда и ловушка.
Спасибо за любую помощь
Вот обновленный файл маршрутов согласно ответу ниже:
class RouteConstraint
RESERVED_ROUTES = ['users', 'my-stuff']
def matches?(request)
!RESERVED_ROUTES.map {|r| request.path.include?(r)}.empty?
end
end
App::Application.routes.draw do
resources :categories
resources :sites
match '*path' => 'router#routing', :constraints => RouteConstraint.new
devise_for :users, :path_names =>{ :sign_in => 'login', :sign_out => 'logout', :registration => 'register' }
root :to => "router#routing"
end