Rails 3 Routing Constraint и Regex - PullRequest
       16

Rails 3 Routing Constraint и Regex

1 голос
/ 09 мая 2011

Я ищу соответствующий шаблон state/city в пути, если только переменная состояния не равна "auth"

match '/:state/:city' => 'cities#index', :as => :state_cities, :constraints => {:state => /(?!auth)/ }

Например, mydomain.com/fl/miami - это хорошо.mydomain.com/auth/twitter плохо.

Я использую omniauth, и для аутентификации вам нужно перейти на /auth/twitter, однако, когда я набираю rake routes.

, его нигде не найти.

Ответы [ 2 ]

6 голосов
/ 09 мая 2011

На основании мю слишком коротких комментариев, вот ответ, который я придумал:

match '/:state/:city' => 'cities#index', :as => :state_cities, :constraints => OmniauthPassThru.new

Библиотека / omniauth_pass_thru.rb

class OmniauthPassThru
    def initialize
        @passthru = ["/auth/facebook", "/auth/twitter"]
    end

    def matches?(request)
        return false if @passthru.include?(request.fullpath)
        true
    end
end
4 голосов
/ 09 мая 2011

Вы должны быть в состоянии определить свой маршрут /auth перед маршрутами вашего штата / города:

Приоритет маршрута

Не все маршруты созданы одинаково.Приоритеты маршрутов определяются порядком появления маршрутов в файле config / rout.rb.Приоритет идет сверху вниз.

Таким образом, этот порядок должен действовать правильно:

match '/auth/twitter' => ...
match '/:state/:city' => ... 

Возможно, вы захотите избежать этой проблемы, указав маршруты своего штата / города.в их собственное пространство имен:

match '/place/:state/:city' => ...

Это оставляет верхний уровень прозрачным для других будущих применений.

...