我有一个Rails 4.0应用程序,允许用户通过子域访问博客。我的路线目前看起来像这样:
match '', to: 'blogs#show', via: [:get, :post], constraints: lambda { |r| r.subdomain.present? && r.subdomain != 'www' }
resources :foobars
现在,当我导航到somesubdomain.example.com
时,我确实按照预期接受了show
控制器操作的blogs
操作。
当我导航到example.com/foobars
时,我可以按预期访问index
控制器的foobars
操作。
然而,我只得到一个我不想要的行为:
当我导航到somesubdomain.example.com/foobars
时,我仍然可以访问index
控制器的foobars
操作。
有没有办法限制或排除我没有特别允许特定子域的所有资源(即除非另有说明,否则somesubdomain.example.com/foobars
将无效)。
谢谢!
答案 0 :(得分:2)
如果您需要从一组路线中定义一个特定子域排除,您可以执行此操作(使用否定前瞻性正则表达式):
# exclude all subdomains with 'www'
constrain :subdomain => /^(?!www)(\w+)/ do
root to: 'session#new'
resources :foobars
end
或者类似地,要将特定子域定义为包含一组路由,您可以执行此操作:
# only for subdomain matching 'somesubdomain'
constrain :subdomain => /^somesubdomain/ do
root to: 'blog#show'
resources :foobars
end
另一种方法是在类(或模块)中定义约束匹配,然后在constraints
块中包装所有路由:
class WorldWideWebSubdomainConstraint
def self.matches?(request)
request.subdomain.present? && request.subdomain != 'www'
end
end
App::Application.routes.draw do
# All "www" requests handled here
constraints(WorldWideWebSubdomainConstraint.new) do
root to: 'session#new'
resources :foobars
end
# All non "www" requests handled here
root to: 'blogs#show', via: [:get, :post]
end