Não consegui encontrar uma solução viável para esse problema, apesar de várias perguntas semelhantes aqui e em outros lugares. Parece provável que esta questão não tenha sido respondida para Rails 3, então aqui vai:
Eu tenho um aplicativo que atualmente permite que os usuários criem seu próprio subdomínio que contém sua instância do aplicativo. Enquanto no Rails 2 você foi melhor servido usando a gem subdomain-fu, na versão 3 é dramaticamente mais simples, de acordo com o Railscast - http://railscasts.com/episodes/221-subdomains-in-rails-3 .
Isso é bom, mas também quero oferecer a opção para os usuários associarem seu próprio nome de domínio à conta. Então, embora eles possam ter http://userx.mydomain.com , eu gostaria que eles escolhessem ter http://userx.com associado também.
Eu encontrei algumas referências a fazer isso no Rails 2, mas essas técnicas parecem não funcionar mais (particularmente este aqui: https://feefighters.com/blog/hosting-multiple-domains-from-a-single-rails -app / ).
Alguém pode recomendar uma maneira de usar rotas para aceitar um domínio arbitrário e passá-lo para um controlador para que eu possa mostrar o conteúdo apropriado?
Atualização : recebi a maior parte das respostas agora, graças à resposta oportuna de Leonid e uma nova visão do código. No final das contas, ele exigiu uma adição ao código de subdomínio existente que eu estava usando (da solução Railscast) e, em seguida, adicionando um pouco a routes.rb. Ainda não cheguei lá, mas quero postar o que tenho até agora.
Em 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
Eu adicionei a segunda classe em imitação da primeira, que está funcionando. Eu simplesmente adiciono uma condição que garante que o domínio de entrada não seja aquele para o qual estou hospedando o site principal.
Esta classe é usada em routes.rb:
require 'subdomain'
constraints(Domain) do
match '/' => 'blogs#show'
end
constraints(Subdomain) do
match '/' => 'blogs#show'
end
Aqui, estou prefixando o código de subdomínio existente (novamente, está funcionando bem) com uma estrofe para verificar o domínio. Se este servidor responder a esse domínio e não for aquele sob o qual o site principal opera, encaminhe para o controlador especificado.
E embora isso pareça estar funcionando, não tenho tudo funcionando ainda, mas acho que esse problema específico foi resolvido.
fonte
Respostas:
Na verdade, é mais simples no Rails 3, conforme http://guides.rubyonrails.org/routing.html#advanced-constraints :
1) definir uma classe de restrição personalizada em
lib/domain_constraint.rb
:2) use a classe em suas rotas com a nova sintaxe de bloco
ou a sintaxe de opção antiquada
fonte
/etc/hosts
).request.domain
retornará .com.dev. Muderequest.domain
pararequest.host
e funcionará perfeitamente.Invalid route name, already in use: 'root'
erro ... Para fazer isso, alterei a rota pararoot :to => 'mydomain#index', as: nil
No Rails 5, você pode simplesmente fazer isso em suas rotas:
fonte