2010-11-17 13 views
81

Bu soruna uygulanabilir bir çözüm bulamadım, ancak burada ve başka yerlerde benzer sorulara rağmen. Bu sorunun Rails 3 için yanıtlanmamış olması muhtemel görünüyor, bu yüzden işte burada:Tek bir uygulamada birden çok etki alanını işlemek için yönlendirmeler raylar

Şu anda kullanıcıların uygulama örneklerini içeren kendi alt etki alanlarını oluşturmalarına izin veren bir uygulamaya sahibim. Rails 2'de en iyi subdomain-fu gemini kullanarak hizmetinizdeyken, 3. sürümde, Railscast - http://railscasts.com/episodes/221-subdomains-in-rails-3'a göre oldukça daha basittir.

Bu iyi bir şey, ancak kullanıcıların kendi alan adlarını kendi hesaplarıyla ilişkilendirmelerini de sağlamak istiyorum. Yani http://userx.mydomain.com olabilir, onlar da ilişkili http://userx.com sahip olmayı tercih ederim.

Rails 2'de bunu yapmak için birkaç başvuru buldum, ancak bu teknikler artık işe yaramıyor (özellikle bu: http://feefighters.com/devblog/2009/01/21/hosting-multiple-domains-from-a-single-rails-app/).

Herhangi biri isteğe bağlı bir etki alanını kabul etmek ve bir denetleyiciye iletmek için rotaları kullanmanın bir yolunu önerebilir, böylece uygun içeriği gösterebilir miyim?

Güncelleştirme: Leonid'in zamanında yanıtı ve kodun yeni görünümü sayesinde şimdi bir yanıtın çoğunu aldım. Nihayetinde kullandığım (Substream çözümünden) mevcut Subdomain koduna bir ekleme ve ardından route.rb'ye bir bit eklenmesi gerekiyordu. Henüz oraya gitmiyorum ama şu ana kadar sahip olduğum şeyi yayınlamak istiyorum. lib/subdomain.rb olarak

: I çalışma bilinen birinci taklit ikinci sınıf ekledik

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 

. Sadece gelen alanın ana siteye ev sahipliği yaptığım yer olmamasını sağlayan bir koşul eklemekteyim.

Bu sınıf routes.rb kullanılır: Burada

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

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

, ben Domain kontrol etmek için bir dörtlük ile mevcut alt alan kodunu (yine düzgün şekilde çalışıyorsa) prepending ediyorum. Bu sunucu söz konusu alana yanıt veriyorsa ve ana sitenin çalıştığı, belirtilen denetleyiciye yönlendirilen değil.

Ve bu işe yarıyor gibi gözükse de, henüz her şeyin işe yaramadığını düşünüyorum, ancak bu özel sorunun çözüldüğünü düşünüyorum.

http://guides.rubyonrails.org/routing.html#advanced-constraints başına gibi, Rails 3 aslında basittir
+1

Düzenlemeleriniz için çok teşekkürler, Aaron. Şu an aynı durumla uğraşıyorum. Bir takip sorusu olarak, sunucunuza yönlendirilmekte olan herhangi bir etki alanını kabul etmesini nasıl sağlayabilirsiniz? .Conf dosyasında bir ayar olacağını varsayalım, ama ne olduğundan emin değilim.Herhangi bir yardım takdir edilecektir! – deadwards

+0

Aaron, seninleyim. Ben de aynı şeyi yapmak istiyorum. Ama etki alanını kodlamak istemiyorum. Her şey bölge dosyaları ve web sunucusu yeniden başlatılmadan programlı olarak yapılmasını istiyorum. –

+1

Michael, sorunu ters çevirmeniz gerekiyor. Açıkça, uygulamanız için olan rotaları (örneğin, kayıt) bir ana makine veya alt alan sınırlamasıyla açıkça belirtin ve yeniden kodlayın, ardından ana yollarınızı "herhangi bir etki alanı veya alt etki alanı" olarak kabul edin. Bu durumda, mevcut etki alanı veya alt etki alanını aramak ve doğru müşteriye eşlemek için denetleyicilerinizin sorumluluğu. –

cevap

88

:

1) lib/domain_constraint.rb özel bir kısıtlama sınıfını tanımlar:

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

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

2) yeni blok sözdizimi

ile rotalara sınıfını 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') 
+0

Cevabınız için teşekkürler ... Umudumdan vazgeçmiştim! Ancak bu koda baktığımızda, kullanılan alanı tahmin etmem gerektiği anlaşılıyor. Herhangi bir keyfi etki alanı kullanmak istiyorum. Ama şimdi cevabı keşfettim (çoğunlukla), bu yüzden yukarıdaki sorumu düzenleyeyim. –

+0

Sınıfı neden başlatıcıda bildirdiniz? Bu lib içinde olmasın mı? – ybakos

+0

Evet, lib olmalıdır. –

İlgili konular