Рельсы 3: облегчение чтения и внесения поправок в универсальный маршрут - PullRequest
5 голосов
/ 07 октября 2011

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

Ответы [ 2 ]

6 голосов
/ 07 октября 2011

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

class MyConstraint
  BYPASSED_ROUTES = ['users', 'my-stuff']

  def matches?(request)
    BYPASSED_ROUTES.map {|r| request.path.include?(r)} .empty?
  end
end

TwitterClone::Application.routes.draw do
  match "*path" => "router#routing", :constraints => MyConstraint.new
end

Этот пример взят из руководства по прокладке рельсов .

0 голосов
/ 07 октября 2011

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

...