Маршрутизация Rails для обработки нескольких доменов в одном приложении

Я не смог найти подходящее решение этой проблемы, несмотря на несколько подобных вопросов здесь и в других местах. Кажется вероятным, что этот вопрос не ответил на 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, но эти методы больше не работают (особенно этот: http://feefighters.com/devblog/2009/01/21/hosting-multiple-domains-from -a-single-rails-app / ).

Может ли кто-нибудь рекомендовать способ использования маршрутов для принятия произвольного домена и передать его вместе с controllerом, чтобы я мог показать соответствующий контент?

Обновление : теперь я получил большую часть ответа, благодаря своевременному отклику Леонида, и новый взгляд на код. В конечном итоге это потребовало добавления к существующему коду Subdomain, который я использовал (из решения Railscast), а затем добавив бит в route.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 

Я добавил второй class в подражание первому, который известен как работающий. Я просто добавляю условие, гарантирующее, что входящий домен не тот, для которого я размещаю основной сайт.

Этот class используется в routes.rb:

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

Здесь я добавлю существующий код поддомена (опять же, он работает нормально) со строфой, чтобы проверить домен. Если этот сервер отвечает на этот домен, и это не тот, на котором работает основной сайт, перейдите к указанному controllerу.

И хотя это, кажется, работает, я не совсем все это работаю, но я думаю, что эта конкретная проблема решена.

    Это на самом деле проще в Rails 3, в соответствии с http://guides.rubyonrails.org/routing.html#advanced-constraints :

    1) определить пользовательский class ограничений в lib/domain_constraint.rb :

     class DomainConstraint def initialize(domain) @domains = [domain].flatten end def matches?(request) @domains.include? request.domain end end 

    2) используйте class в своих маршрутах с новым синтаксисом блока

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

    или старомодный синтаксис опций

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

    В Rails 5 вы можете просто сделать это на своих маршрутах:

     constraints subdomain: 'blogs' do match '/' => 'blogs#show' end 
    Interesting Posts

    Как реализовать «mustMatch» и «selectFirst» в автозаполнении пользовательского интерфейса jQuery?

    Как выровнять мертвую точку изображения с помощью бутстрапа

    Создание виртуального изображения физического раздела

    Почему реализация Equals для анонимных типов сравнивает поля?

    Как изменить режим браузера в IE9 на постоянной основе?

    Что эта команда: () {: |: &} ;: делает?

    Как Java разрешает относительный путь в новом файле ()?

    Могу ли я получить доступ к библиотеке iTunes для Mac из iPad?

    Код VBscript для захвата stdout, без отображения windows консоли

    «Файл не найден» в заголовке Bridging при импорте объектов Objective-C в проект Swift от CocoaPod

    Как отменить последние коммиты в Git?

    Заменить NA в столбце со значением в соседнем столбце

    Что означают цвета слота для ОС материнской платы?

    Неопределенное поведение sizeof (* ptr) при указании на недопустимую память?

    Как поместить двойные кавычки в строку в vba?

    Давайте будем гением компьютера.