91 votes

Routage Rails pour gérer plusieurs domaines sur une seule application

J'ai été incapable de trouver une solution viable à ce problème, en dépit de plusieurs autres questions d'ici et d'ailleurs. Il semble probable que cette question n'a pas été répondu pour Rails 3, donc voilà:

J'ai une application qui permet aux utilisateurs de créer leur propre sous-domaine qui contient leur instance de l'application. Alors que dans les Rails 2 vous avez été le mieux servi en utilisant le sous-domaine-fu gem, dans la version 3, c'est beaucoup plus simple, comme par le Railscast -- http://railscasts.com/episodes/221-subdomains-in-rails-3.

Que de bonnes choses, mais je veux aussi offrir la possibilité pour les utilisateurs d'associer leur propre nom de domaine avec leur compte. Ainsi, alors qu'ils pourraient avoir http://userx.mydomain.comj'aimerais choisir d'avoir http://userx.com associés ainsi.

J'ai trouvé quelques références de le faire en 2 Rails, mais ces techniques ne semblent pas fonctionner (en particulier celui-ci: http://feefighters.com/devblog/2009/01/21/hosting-multiple-domains-from-a-single-rails-app/).

Quelqu'un peut-il recommander une façon d'utiliser les routes à accepter l'arbitraire d'un domaine et de le transmettre à un dispositif de commande afin que je puisse afficher le contenu approprié?

Merci d'avance,

Aaron.

Mise à jour: j'ai reçu plus d'une réponse maintenant, grâce à Leonid du temps de réponse, et un regard neuf sur le code. Il requiert, en définitive, une outre le sous-domaine de code que j'ai utilisé (à partir de la Railscast solution), puis en ajoutant un peu de routes.rb. Je ne suis pas tout le chemin là encore, mais je tiens à poster ce que j'ai jusqu'ici.

Dans lib/sous-domaine.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

J'ai ajouté de la deuxième classe à l'imitation de la première, qui est connu de travail. J'ai simplement ajouter une condition qui garantit que les entrants de domaine n'est pas celui pour lequel je suis d'hébergement du site principal.

Cette classe est utilisée dans les circuits.rb:

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

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

Ici, je suis en ajoutant le sous-domaine existant code (encore une fois, ça fonctionne très bien) avec une strophe à vérifier pour le Domaine. Si ce serveur répond à ce domaine et ce n'est pas celui sous lequel le site principal fonctionne, en avant pour le contrôleur spécifié.

Et même si cela semble fonctionner, je n'ai pas assez de toute la chose encore, mais je pense que ce problème a été résolu.

98voto

Leonid Shevtsov Points 5728

C'est en fait plus simple dans Rails 3, selon http://guides.rubyonrails.org/routing.html#advanced-constraints :

1) définir une classe de contrainte personnalisée dans lib/domain_constraint.rb :

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

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

2) utiliser la classe dans vos itinéraires avec la nouvelle syntaxe de bloc

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

root :to => 'main#index'
 

ou la syntaxe des options à l'ancienne

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X