Rails路由域通配符

时间:2013-02-24 15:27:40

标签: ruby-on-rails routing subdomain

我尝试根据this railscast为Rails创建域通配符路由。但是我想和#34;范围"本机路由中的功能,例如

  domain ':city_id.mysite.com' do
    root :to => "cities#test"
  end

恕我直言,它看起来比正则表达式更漂亮,但我懒得为#34;:city_id.mysite.com"这样的路径编写解析器。我自己一个人。我相信它已经存在于rails中的某个地方,但我无法在源代码中找到它。 也可以使用:约束,:as,:范围和此路线的其他配置,但htis是可选的。

现在我的代码如下:

module Domain
  class Match
    def initialize(wildcard, *options)
      @wildcard = wildcard
    end

    def matches?(request)
      request.path_parameters[:city_id] = request.subdomain #to replace this with setting parameters from wildcard, :default and so on
      request.subdomain.present? #to replace this string with wildcard-match condition
    end
  end

  module Mapper
    def domain(wildcard='')
      constraints(Domain::Match.new wildcard) { yield }
    end
  end
end

ActionDispatch::Routing::Mapper.send(:include, Domain::Mapper)

因此,我只能为子域创建路由

  domain 'subdomain' do
    root :to => "cities#test"
  end

我只能获得硬编码参数' city_id'在控制器

1 个答案:

答案 0 :(得分:0)

好吧,也许对某人有用。我发现,Journey :: Path :: Pattern可以用于此。添加到初始化:

  @pattern = Journey::Path::Pattern.new(
      Journey::Router::Strexp.compile(path, constraints, ['.'])
  )

检查时 -

  match_data  = @pattern.match(request.host)
  return false if match_data.nil?