2011-05-07 12 views
6

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 

답변

11

당신은 어떤 도메인을 제외하기 위해 제약 정규식에 negative lookahead를 사용할 수 있습니다.

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

이 내가에 제공되는 솔루션입니다 Rubular

+1

이 기술을 도와 주셔서 감사합니다. 나는 그 패턴을 첫 번째 비트와 이후의 추가 문자와 패턴이 일치하지 않게하기 위해 정규식을 더 제한하기 위해 직접 수정했다. –

+1

@edgerunner Rubular 링크도 주셔서 감사합니다! – scarver2

3

에이를보십시오. 조지는 대단한 edgerunner &에 의해 제안

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

그것은 부정적 예측을 사용하여 api하지만 하지apis

+0

'api'가 아닌'api'는 제외하지만'api-foo'도 제외 할 것임을 명심하십시오. '\ b' (단어 경계, George가 분명히 알고있는 것처럼) 대신'\ Z' (문자열의 끝)을 사용하면 더 이상'api-foo'를 제외하지 않을 것입니다. (물론이 모든 문자열을 제외시키려는 이유에 따라 다르지만 더 많은 옵션이 더 좋습니다.) –

1

일치합니다.

는 기본적으로 패턴이 될 것입니다 :

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 
1

: 여기

차이를 보여주는 테스트 케이스의 무리입니다 지정된 순서로 라우트에 대한 요청을 일치시킵니다. 일치하는 것이 발견되면 나머지 경로는 이 아니며이 확인됩니다. 예약 된 하위 도메인 블록에서 glob up all remaining routes 수 있으며 오류 페이지로 요청을 보냅니다.

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