ここと他の場所で同様の質問がいくつかありますが、この問題に対する有効な解決策を見つけることができませんでした。 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
ここでは、既存のサブドメインコードの前に、ドメインを確認するためのスタンザを追加しています(ここでも正常に機能しています)。このサーバーがそのドメインに応答し、メインサイトが動作するドメインではない場合、指定されたコントローラーに転送します。
そして、それは機能しているように見えますが、私はまだ完全に機能しているわけではありませんが、この特定の問題は解決されたと思います。
実際には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')
Rails 5では、ルートでこれを簡単に行うことができます。
constraints subdomain: 'blogs' do
match '/' => 'blogs#show'
end