在我的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
您可以在约束正则表达式中使用负预测来排除某些域。
constrain :subdomain => /^(?!login|signup)(w+)/ do
resources :whatever
end
在 Rubular 上试试这个
我得出的解决方案。
constrain :subdomain => /^(?!signupb|apib)(w+)/ do
resources :whatever
end
它将匹配api
但不apis
重新审视这个老问题,我只是想到了另一种可以根据您想要什么而起作用的方法......
Rails 路由器尝试按指定的顺序将请求与路由匹配。如果找到匹配项,则不检查其余路由。在保留的子域块中,您可以清理所有剩余的路由并将请求发送到错误页面。
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
按照 edgerunner 和 George 的建议使用负面展望是很棒的。
基本上模式将是:
constrain :subdomain => /^(?!signupZ|apiZ)(w+)/ do
resources :whatever
end
这与 George 的建议相同,但我将b
更改为 Z
——从单词边界更改为输入字符串本身的末尾(如我对 George 答案的评论中所述)。
这里有一堆测试用例显示了差异:
irb(main):001:0> re = /^(?!wwwb)(w+)/
=> /^(?!wwwb)(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 = /^(?!wwwZ)(w+)/
=> /^(?!wwwZ)(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