Ограничение поддоменов и исключение определенных поддоменов - PullRequest
6 голосов
/ 08 мая 2011

В моем файле routes.rb я хочу использовать функцию ограничений поддоменов в rails3, однако я бы хотел исключить некоторые домены из перехвата всего маршрута.Я не хочу иметь определенный контроллер в конкретном поддомене.Что было бы наилучшей практикой при этом.

# this subdomain i dont want all of the catch all routes
constraints :subdomain => "signup" do
  resources :users
end

# here I want to catch all but exclude the "signup" subdomain
constraints :subdomain => /.+/ do
  resources :cars
  resources :stations
end

Ответы [ 4 ]

11 голосов
/ 08 мая 2011

Вы можете использовать отрицательный прогноз в регулярном выражении ограничения для исключения некоторых доменов.

constrain :subdomain => /^(?!login|signup)(\w+)/ do
  resources :whatever
end

Попробуйте это на Rubular

3 голосов
/ 08 мая 2011

это решение, к которому я пришел.

constrain :subdomain => /^(?!signup\b|api\b)(\w+)/ do
  resources :whatever
end

оно будет соответствовать api, но не apis

1 голос
/ 24 июня 2015

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

Rails Router пытается сопоставить запрос с маршрутом в указанном порядке. Если совпадение найдено, остальные маршруты не проверяются . В вашем зарезервированном блоке поддоменов вы можете собрать все оставшиеся маршруты и отправить запрос на страницу с ошибкой.

constraints :subdomain => "signup" do
  resources :users
  # if anything else comes through the signup subdomain, the line below catches it
  route "/*glob", :to => "errors#404" 
end

# these are not checked at all if the subdomain is 'signup'
resources :cars
resources :stations
1 голос
/ 16 июля 2011

Использование отрицательного взгляда, как предложено edgerunner & George, замечательно.

В основном шаблон будет выглядеть так:

constrain :subdomain => /^(?!signup\Z|api\Z)(\w+)/ do
  resources :whatever
end

Это то же самое, что предложение Джорджа, но я изменил\b до \Z - переход от границы слова к концу самой входной строки (как отмечено в моем комментарии к ответу Джорджа).

Вот несколько тестов, показывающих разницу:

irb(main):001:0> re = /^(?!www\b)(\w+)/
=> /^(?!www\b)(\w+)/
irb(main):003:0> re =~ "www"
=> nil
irb(main):004:0> re =~ "wwwi"
=> 0
irb(main):005:0> re =~ "iwwwi"
=> 0
irb(main):006:0> re =~ "ww-i"
=> 0
irb(main):007:0> re =~ "www-x"
=> nil
irb(main):009:0> re2 = /^(?!www\Z)(\w+)/
=> /^(?!www\Z)(\w+)/
irb(main):010:0> re2 =~ "www"
=> nil
irb(main):011:0> re2 =~ "wwwi"
=> 0
irb(main):012:0> re2 =~ "ww"
=> 0
irb(main):013:0> re2 =~ "www-x"
=> 0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...