Маршрут Rails к экземпляру модели - по доменному имени - PullRequest
2 голосов
/ 24 июля 2010

У меня есть приложение Rails 3, скажем, с отелями, где отели принадлежат родительским областям. Когда пользователь запускает приложение (обслуживается mongrel >> nginx), я хочу, чтобы доменное имя, использованное в запросе, решало, какую зону отелей обслуживать (доменное имя >> зона). Для этого я вижу два варианта:


1) Перепишите URL с помощью nginx, вставив идентификатор области после имени домена (например, birminghamhotels.co.uk => proxy_pass http://myupstream/areas/3$request_uri).

Преимущества: Сопоставление доменов и объектов происходит там, где определены принятые домены: nginx.conf. Должен быть прозрачным для пользователей (красивые URL возможны, так как они переписаны).

Недостатки: Перерывы в Rails-помощниках URL, больше нет link_to или form_for. Жестко запрограммированная ссылка на объект является непослушной.


2) Поймайте доменное имя в Routes.rb и ищите Район с помощью уникального атрибута «домен» для каждого Района (или даже has_many, если хотите).

Преимущества: Следует разрешить использование всех URL-помощников Rails. Запрашиваемый домен связан напрямую с ресурсом, поэтому исключения могут быть обработаны.

Недостатки: Без перезаписи URL с помощью nginx пользователи не увидят: birminghamhotels.co.uk/areas/3/hotels/42 вместо просто birminghamhotels.co.uk/hotels/42? Кроме того, я понятия не имею, как это сделать!


Итак, я попробовал вариант № 1, но столкнулся с проблемами с помощниками URL и т. Д. Я пытался найти способ попробовать вариант № 2, но не смог найти правильный синтаксис, несмотря на то, что много глазного Теперь тот факт, что я не могу найти какие-либо ответы путем поиска, заставляет меня думать, что я получил неправильный конец этой проблемы. Есть ли третий вариант? Как бы вы решили это?

Да, и между прочим, я не создаю еще один веб-сайт с перечнем отелей - их уже достаточно. Просто оказалось достаточно близким примером.

1 Ответ

1 голос
/ 30 июля 2010

Предполагая, что в каждой области есть какое-то поле domain_name, кажется, что вы должны иметь возможность сделать что-то вроде этого:

class HotelsController < ApplicationController
  def index
    @hotels = Area.find_by_domain_name(request.subdomains.first).hotels
  end
end

Вы можете даже преобразовать его в named_scope, используя лямбду, если хотите.

...