子域约束并排除某些子域

时间:2011-05-07 20:43:14

标签: ruby-on-rails ruby regex ruby-on-rails-3

在我的routes.rb文件中,我想在rails3中使用子域约束功能,但是我想从catch all路径中排除某些域。我不想在特定的子域中使用某个控制器。这样做的最佳做法是什么。

# 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 个答案:

答案 0 :(得分:11)

您可以在约束正则表达式中使用negative lookahead来排除某些域。

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

Rubular

上试试这个

答案 1 :(得分:3)

这是我来的解决方案。

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

它将与api匹配,但不是 apis

答案 2 :(得分:1)

使用edgerunner& amp;乔治很棒。

基本上,模式将是:

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

这与George的建议相同,但我将\b更改为\Z - 从单词边界更改为输入字符串本身的末尾(如我对George的答案的评论中所述)。

以下是一组显示差异的测试用例:

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

答案 3 :(得分:1)

重新回答这个老问题,我只想到了另一种方法,可以根据你想要的方式发挥作用......

Rails路由器尝试按指定的顺序将请求与路由匹配。如果找到匹配项,则其余路线选中。在您保留的子域块中,您可以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