Я пытаюсь написать всеобъемлющий маршрут в 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