从Rails中的子域中排除所有其他资源

时间:2014-01-16 22:51:47

标签: ruby-on-rails ruby-on-rails-4 rails-routing

我有一个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将无效)。

谢谢!

1 个答案:

答案 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