web-dev-qa-db-ja.com

Rails単一のアプリケーションで複数のドメインを処理するルーティング

ここと他の場所で同様の質問がいくつかありますが、この問題に対する有効な解決策を見つけることができませんでした。 Rails 3の場合、この質問には回答されていないようです。

現在、ユーザーがアプリケーションのインスタンスを含む独自のサブドメインを作成できるアプリケーションがあります。 Rails 2ではsubdomain-fu gemを使用するのが最適でしたが、バージョン3ではRailscastにより劇的にシンプルになりました- http://railscasts.com/episodes/221-subdomains-in-Rails-

それは良いことですが、ユーザーが自分のドメイン名をアカウントに関連付けるためのオプションも提供したいと思います。 http://userx.mydomain.com を持っているかもしれませんが、同様に http://userx.com を関連付けることを選択したいと思います。

Rails 2でこれを行うことへの参照をいくつか見つけましたが、これらの手法はもはや機能していないようです(特にこの方法: https://feefighters.com/blog/ hosting-multiple-domains-from-a-single-Rails-app / )。

適切なコンテンツを表示できるように、ルートを使用して任意のドメインを受け入れてコントローラーに渡す方法を誰かが推奨できますか?

Update:レオニードのタイムリーな応答とコードの見直しのおかげで、ほとんどの回答が得られました。最終的に、私が使用していた既存のサブドメインコード(Railscastソリューションから)への追加と、routes.rbへの追加が必要でした。私はまだそこまで来ていませんが、これまでの投稿を掲載したいと思います。

Lib/subdomain.rb内:

class Subdomain
  def self.matches?(request)
    request.subdomain.present? && request.subdomain != "www"
  end
end

class Domain
  def self.matches?(request)
    request.domain.present? && request.domain != "mydomain.com"
  end
end

動作することが知られている最初のクラスを模倣して、2番目のクラスを追加しました。着信ドメインがメインサイトをホストしているドメインではないことを保証する条件を追加するだけです。

このクラスはroutes.rbで使用されます:

require 'subdomain'
constraints(Domain) do
  match '/' => 'blogs#show'
end

constraints(Subdomain) do
  match '/' => 'blogs#show'
end

ここでは、既存のサブドメインコードの前に、ドメインを確認するためのスタンザを追加しています(ここでも正常に機能しています)。このサーバーがそのドメインに応答し、メインサイトが動作するドメインではない場合、指定されたコントローラーに転送します。

そして、それは機能しているように見えますが、私はまだ完全に機能しているわけではありませんが、この特定の問題は解決されたと思います。

86
Aaron Vegh

実際にはRails 3、 http://guides.rubyonrails.org/routing.html#advanced-constraints

1)lib/domain_constraint.rbでカスタム制約クラスを定義します:

class DomainConstraint
  def initialize(domain)
    @domains = [domain].flatten
  end

  def matches?(request)
    @domains.include? request.domain
  end
end

2)ルートで新しいブロック構文を使用してクラスを使用する

constraints DomainConstraint.new('mydomain.com') do
  root :to => 'mydomain#index'
end

root :to => 'main#index'

または昔ながらのオプション構文

root :to => 'mydomain#index', :constraints => DomainConstraint.new('mydomain.com')
94
Leonid Shevtsov

Rails 5では、ルートでこれを簡単に行うことができます。

constraints subdomain: 'blogs' do
  match '/' => 'blogs#show'
end
2
user3033467