Мне не удалось найти работоспособное решение этой проблемы, несмотря на несколько похожих вопросов здесь и в других местах. Похоже, что на этот вопрос для 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
Здесь я добавляю к существующему коду поддомена (опять же, он отлично работает) строфу для проверки домена. Если этот сервер отвечает на этот домен, а не тот, под которым работает основной сайт, переадресация на указанный контроллер.
И хотя это, похоже, работает, у меня еще не все работает, но я думаю, что эта конкретная проблема решена.
источник
Ответы:
На самом деле в Rails 3 это проще, согласно http://guides.rubyonrails.org/routing.html#advanced-constraints :
1) определите собственный класс ограничения в
lib/domain_constraint.rb
:class DomainConstraint def initialize(domain) @domains = [domain].flatten end def matches?(request) @domains.include? request.domain end end
2) используйте класс в своих маршрутах с новым синтаксисом блока
constraints DomainConstraint.new('mydomain.com') do root :to => 'mydomain#index' end root :to => 'main#index'
или старомодный синтаксис опций
root :to => 'mydomain#index', :constraints => DomainConstraint.new('mydomain.com')
источник
/etc/hosts
).request.domain
возвращает .com.dev. Изменитеrequest.domain
на,request.host
и он отлично работает.Invalid route name, already in use: 'root'
ошибке ... Для этого я изменил маршрут наroot :to => 'mydomain#index', as: nil
В Rails 5 вы можете просто сделать это в своих маршрутах:
constraints subdomain: 'blogs' do match '/' => 'blogs#show' end
источник