1

この railscastに基づいて、Rails のドメイン ワイルドカード ルーティングを作成しようとしています。しかし、ネイティブルーティングの「スコープ」機能と同じくらいいいものにしたいと思います。

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

私見ですが、正規表現よりもきれいに見えますが、「:city_id.mysite.com」のようなパスのパーサーを自分で書くのが面倒です。レール内のどこかに既に存在していると思いますが、ソースコードで見つけることができません。また、このルートに :constraints、:as、:scope およびその他の構成を使用することもできますが、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」のみを取得できます

4

1 に答える 1

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?
于 2013-02-26T10:28:16.563 に答える