Tek bir uygulamada birden çok etki alanını yönetmek için ray yönlendirme


90

Burada ve başka yerlerde benzer birkaç soruya rağmen, bu soruna uygulanabilir bir çözüm bulamadım. Görünüşe göre bu soru Rails 3 için cevaplanmamış, bu yüzden işte:

Şu anda kullanıcıların, uygulama örneğini içeren kendi alt alanlarını oluşturmalarına izin veren bir uygulamam var. Rails 2'de size en iyi şekilde alt alan-fü mücevherini kullanarak hizmet verilmişken, sürüm 3'te, Railscast - http://railscasts.com/episodes/221-subdomains-in-rails-3'e göre çok daha basit .

Bu iyi bir şey, ancak kullanıcılara kendi alan adlarını hesaplarıyla ilişkilendirme seçeneği de sunmak istiyorum. Onlar olabilir süre Yani http://userx.mydomain.com , ben tercih etmelerini istiyoruz http://userx.com sıra ilişkili.

Bunu Rails 2'de yapmak için birkaç referans buldum, ancak bu teknikler artık işe yaramıyor gibi görünüyor (özellikle bu: https://feefighters.com/blog/hosting-multiple-domains-from-a-single-rails -app / ).

Herhangi biri rasgele bir etki alanını kabul etmek için yolları kullanmanın bir yolunu önerebilir ve uygun içeriği gösterebilmem için bunu bir denetleyiciye iletebilir mi?

Güncelleme : Leonid'in zamanında verdiği yanıt ve koda yeni bir bakış sayesinde şimdi bir cevabın çoğunu aldım. Nihayetinde kullanmakta olduğum (Railscast çözümünden) mevcut Subdomain koduna bir ekleme ve ardından route.rb'ye biraz ekleme gerektirdi. Henüz tam olarak orada değilim ama şu ana kadar sahip olduğum şeyi göndermek istiyorum.

Lib / subdomain.rb'de:

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

Çalıştığı bilinen birinci sınıfın taklidi olarak ikinci sınıfı ekledim. Ben sadece, gelen etki alanının ana siteyi barındırdığım alan olmamasını sağlayan bir koşul ekliyorum.

Bu sınıf, route.rb'de kullanılır:

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

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

Burada, Etki Alanını kontrol etmek için mevcut alt etki alanı kodunu (yine, iyi çalışıyor) başına ekliyorum. Bu sunucu bu etki alanına yanıt verirse ve ana sitenin altında çalıştığı sunucu değilse, belirtilen denetleyiciye iletin.

Ve bu işe yarıyor gibi görünse de, henüz her şey tam olarak çalışmıyor, ancak bu özel sorunun çözüldüğünü düşünüyorum.


1
Düzenlemen için çok teşekkürler, Aaron. Şu anda aynı durumla uğraşıyorum. Sonraki soru olarak, sunucunuzun kendisine iletilen herhangi bir alanı kabul etmesini nasıl sağlarsınız? Bunun .conf dosyasında bir ayar olacağını varsayıyorum, ancak ne olduğundan emin değilim. Herhangi bir yardım memnuniyetle karşılanacaktır!
deadwards

Aaron, seninleyim. Ben de aynı şeyi yapmak istiyorum. Ancak alanı sabit kodlamak istemiyorum. Tüm bunların, bölge dosyaları olmadan ve web sunucusu yeniden başlatılmadan programla yapılmasını istiyorum.
Michael K Madison

1
Michael, sorunu tersine çevirmen gerek. Bir ana bilgisayar veya alt alan adı kısıtlamasıyla yalnızca uygulamanız için olan yolları (örneğin kaydolma) açık bir şekilde açıklayın ve kodlayın, ardından ana rotalarınızı "herhangi bir alan adı veya alt alan adı" olarak değerlendirin. Daha sonra, mevcut etki alanını veya alt etki alanını aramak ve doğru müşteriye eşlemek denetleyicilerinizin sorumluluğundadır.
Justin French

Yanıtlar:


95

Aslında, http://guides.rubyonrails.org/routing.html#advanced-constraints uyarınca Rails 3'te daha basittir :

1) içinde özel bir kısıtlama sınıfı tanımlayın lib/domain_constraint.rb:

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

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

2) sınıfı yeni blok sözdizimi ile rotalarınızda kullanın

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

root :to => 'main#index'

veya eski moda seçenek sözdizimi

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

6
Bu cevap bana çok daha basit görünüyor.
Jared

7
Bu harika bir çözüm. Bir geliştirme ortamı ile nasıl çalışır?
Superluminary

2
@superluminary, geliştirme için yerel etki alanları (örneğin, aracılığıyla /etc/hosts) ayarlarsanız mükemmel şekilde çalışır .
Leonid Shevtsov

7
Not: Yerel olarak Pow kullanıyorsanız ve request.domainalanadim.com.dev varsa, .com.dev döndürür. Değişim request.domainiçin request.hostve mükemmel çalışıyor.
Eric Muyser

2
Bunun çalışması için isimsiz rotalar oluşturmam gerektiğini buldum, aksi halde Invalid route name, already in use: 'root'hatayı alıyorum ... Bunu yapmak için rotayı şu şekilde değiştirdimroot :to => 'mydomain#index', as: nil
Just Lucky Really

6

Rails 5'te, bunu rotalarınızda kolayca yapabilirsiniz:

constraints subdomain: 'blogs' do
  match '/' => 'blogs#show'
end
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.