Мне не удалось найти работоспособное решение этой проблемы, несмотря на несколько похожих вопросов здесь и в других местах. Похоже, что на этот вопрос для Rails 3 нет ответа, так что вот:
У меня есть приложение, которое в настоящее время позволяет пользователям создавать свой собственный поддомен, содержащий их экземпляр приложения. В то время как в Rails 2 вам лучше всего служил гем subdomain-fu, в версии 3 это значительно проще, согласно Railscast - http://railscasts.com/episodes/221-subdomains-in-rails-3 .
Это хорошо, но я также хочу предоставить пользователям возможность связать собственное доменное имя со своей учетной записью. Поэтому, хотя у них может быть http://userx.mydomain.com , я бы хотел, чтобы они также выбрали ассоциированный http://userx.com .
Я нашел несколько ссылок на это в Rails 2, но эти методы, похоже, больше не работают (особенно этот: https://feefighters.com/blog/hosting-multiple-domains-from-a-single-rails -app / ).
Может ли кто-нибудь порекомендовать способ использования маршрутов для принятия произвольного домена и передачи его контроллеру, чтобы я мог показать соответствующий контент?
Обновление : теперь я получил большую часть ответа, благодаря своевременному ответу Леонида и свежему взгляду на код. В конечном итоге потребовалось дополнить существующий код поддомена, который я использовал (из решения Railscast), а затем добавить немного в routes.rb. Я еще не дошел до конца, но я хочу опубликовать то, что у меня есть.
В 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
Я добавил второй класс в имитацию первого, заведомо работающего. Я просто добавляю условие, которое гарантирует, что входящий домен не тот, для которого я размещаю основной сайт.
Этот класс используется в routes.rb:
require 'subdomain'
constraints(Domain) do
match '/' => 'blogs#show'
end
constraints(Subdomain) do
match '/' => 'blogs#show'
end
Здесь я добавляю к существующему коду поддомена (опять же, он отлично работает) строфу для проверки домена. Если этот сервер отвечает на этот домен, а не тот, под которым работает основной сайт, переадресация на указанный контроллер.
И хотя это, похоже, работает, у меня еще не все работает, но я думаю, что эта конкретная проблема решена.