如何使用约束来限制许多路线?

时间:2017-05-01 13:38:45

标签: ruby-on-rails

我不想创建2个Rails应用程序,而是希望使用路径约束来隔离这两个应用程序。

我有一个博客帮助部分:

class BlogHostContraint
  def self.matches?(request)
    request.subdomain = 'blog'
  end
end

class HelpHostContraint
  def self.matches?(request)
    request.subdomain = 'help'
  end
end

我想确保BlogConstraint匹配时我的博客的所有路线都是可见的,博客约束也是如此。

我的意思是,如果我在博客子域中,如果我在URL中添加路由,它不应该呈现或与帮助子域路由的任何路由冲突。

Rails.application.routes.draw.do
  # blog
  get '/' => 'blog#index', constraints: BlogHostContraint
  ..

  # help
  get '/' => 'help#index', constraints: HelpHostConstraint
end

我知道如何使用约束,但只能使用单一路线或资源路线,如:

资源:用户,约束:SomeConstraintHere

如何将一堆路由与一个constain组合在一起,如:

BlogConstraint do 
  get '..'
  get '...'
  post '...'
end

这可能吗?

我必须这样做的原因之一是我希望生成好的URLS,从每个区域博客的根目录开始并提供帮助。

我不想要:

help.example.com/help/index help.example.com/help/page/1

我想:

help.example.com/
help.example.com/page/1   # help_controller#page

和博客一样可能:

blog.example.com/
blog.example.com/page/1   # blog_controller#page

如果它再次拥有不错的网址,我不想要其他建议。

1 个答案:

答案 0 :(得分:3)

您可以将其传递给constraints块:

constraints BlogConstraint do
  get '..'
  get '...'
  post '...'
end

我还认为您的matches?实施不正确。那些应该返回一个布尔值,而你将返回一个赋值。

class BlogHostContraint
  def self.matches?(request)
    # Use a comparison operator instead of an assignment operator.
    request.subdomain == 'blog'
  end
end