Non sono riuscito a trovare una soluzione praticabile a questo problema, nonostante diverse domande simili qui e altrove. Sembra probabile che questa domanda non abbia avuto risposta per Rails 3, quindi ecco qui:
Ho un'applicazione che attualmente consente agli utenti di creare il proprio sottodominio che contiene la loro istanza dell'applicazione. Mentre in Rails 2 era meglio servirsi del subdomain-fu gem, nella versione 3 è notevolmente più semplice, come per Railscast - http://railscasts.com/episodes/221-subdomains-in-rails-3 .
È roba buona, ma voglio anche offrire agli utenti la possibilità di associare il proprio nome di dominio al proprio account. Quindi, sebbene possano avere http://userx.mydomain.com , vorrei che scegliessero di associare anche http://userx.com .
Ho trovato alcuni riferimenti per farlo in Rails 2, ma queste tecniche non sembrano funzionare più (in particolare questa: https://feefighters.com/blog/hosting-multiple-domains-from-a-single-rails -app / ).
Qualcuno può consigliare un modo per utilizzare le route per accettare un dominio arbitrario e passarlo a un controller in modo da poter mostrare il contenuto appropriato?
Aggiornamento : ho ottenuto la maggior parte delle risposte ora, grazie alla risposta tempestiva di Leonid e a un nuovo sguardo al codice. Alla fine ha richiesto un'aggiunta al codice di sottodominio esistente che stavo usando (dalla soluzione Railscast) e quindi aggiunto un po 'a route.rb. Non sono ancora arrivato fino in fondo, ma voglio pubblicare quello che ho finora.
In lib / sottodominio.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
Ho aggiunto la seconda classe a imitazione della prima, che si sa funziona. Aggiungo semplicemente una condizione che assicuri che il dominio in entrata non sia quello per il quale sto ospitando il sito principale.
Questa classe è usata in routes.rb:
require 'subdomain'
constraints(Domain) do
match '/' => 'blogs#show'
end
constraints(Subdomain) do
match '/' => 'blogs#show'
end
Qui, sto anteponendo il codice del sottodominio esistente (di nuovo, funziona bene) con una stanza per verificare il dominio. Se questo server risponde a quel dominio e non è quello in cui opera il sito principale, inoltra al controller specificato.
E mentre sembra funzionare, non ho ancora funzionato tutto, ma penso che questo particolare problema sia stato risolto.