it-swarm.com.de

Rails-Routing für die Verwaltung mehrerer Domänen in einer einzigen Anwendung

Ich konnte trotz einiger ähnlicher Fragen hier und anderswo keine praktikable Lösung für dieses Problem finden. Es ist wahrscheinlich, dass diese Frage für Rails 3 nicht beantwortet wurde.

Ich habe eine Anwendung, mit der Benutzer derzeit eine eigene Unterdomäne erstellen können, die ihre Instanz der Anwendung enthält. Während Sie in Rails 2 am besten mit dem Subdomain-fu-Juwel bedient wurden, ist es in Version 3 wesentlich einfacher, wie in Railscast - http://railscasts.com/episodes/221-subdomains-in-Rails-3 .

Das ist eine gute Sache, aber ich möchte auch die Möglichkeit bieten, dass Benutzer ihren eigenen Domainnamen mit ihrem Konto verknüpfen. Während sie vielleicht http://userx.mydomain.com haben, möchten sie, dass sie auch http://userx.com wählen.

Ich habe in Rails 2 einige Hinweise dazu gefunden, aber diese Techniken scheinen nicht mehr zu funktionieren (insbesondere diese: http://feefighters.com/devblog/2009/01/21/hosting-multiple- domains-from-a-single-Rails-app / ). 

Kann mir jemand eine Möglichkeit empfehlen, mithilfe von Routen eine beliebige Domäne zu akzeptieren und an einen Controller weiterzuleiten, damit ich den entsprechenden Inhalt anzeigen kann?

Update: Ich habe jetzt die meiste Antwort erhalten, dank Leonids rechtzeitiger Antwort und einem neuen Blick auf den Code. Letztendlich war es notwendig, den vorhandenen Subdomain-Code (von der Railscast-Lösung) zu ergänzen und dann zu routes.rb hinzuzufügen. Ich bin noch nicht ganz dort, aber ich möchte veröffentlichen, was ich bisher habe.

In 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

Ich habe die zweite Klasse in Imitation der ersten hinzugefügt, die bekanntermaßen funktioniert. Ich füge einfach eine Bedingung hinzu, die sicherstellt, dass die eingehende Domain nicht die ist, für die ich die Haupt-Site hoste.

Diese Klasse wird in routes.rb verwendet:

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

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

Hier füge ich dem vorhandenen Subdomain-Code (wieder funktioniert er gut) eine Zeilengruppe vor, um nach der Domäne zu suchen. Wenn dieser Server auf diese Domäne antwortet und nicht der Hauptsitz des Hauptsitzes ist, leiten Sie ihn an den angegebenen Controller weiter.

Und obwohl das anscheinend funktioniert, habe ich noch nicht alles im Gange, aber ich denke, dieses spezielle Problem wurde gelöst.

83
Aaron Vegh

In Rails 3 ist es tatsächlich einfacher, wie in http://guides.rubyonrails.org/routing.html#advanced-constraints :

1) Definieren Sie eine benutzerdefinierte Einschränkungsklasse in lib/domain_constraint.rb:

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

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

2) Verwenden Sie die Klasse in Ihren Routen mit der neuen Blocksyntax

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

root :to => 'main#index'

oder die altmodische Optionssyntax

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

In Rails 5 können Sie dies einfach auf Ihren Routen tun:

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