2

ホテルが親エリアに属するRails 3アプリケーションがあります。ユーザーがアプリ (mongrel >> nginx によって提供される) にアクセスすると、リクエストで使用されるドメイン名を使用して、サービスを提供するホテルのエリア (ドメイン名 >> エリア) を決定します。これを実現するには、次の 2 つのオプションがあります。


1)ドメイン名の後にエリア ID を挿入して、nginx で URL を書き換えます (例: 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 も) を介してエリアを検索します。

利点:すべての Rails URL ヘルパーの使用を許可する必要があります。例外を処理できるように、リソースに直接リンクされた要求されたドメイン。

欠点: nginx で URL を書き換えないと、ユーザーは単に birminghamhotels.co.uk/hotels/42 ではなく、birminghamhotels.co.uk/areas/3/hotels/42 を見ませんか? また、私はそれを行う方法の手がかりがありません!


そのため、オプション #1 を試しましたが、URL ヘルパーなどで問題が発生しました。オプション #2 を試す方法を考え出そうとしましたが、多くのことを調べても正しい構文を理解できませんでした。今、検索しても答えが見つからないという事実は、この問題の結末が間違っていると思います。3番目のオプションはありますか? どのように解決しますか?

ああ、ところで、私は別のホテル一覧 Web サイトを作成していません。たまたま十分に近い例でした。

4

1 に答える 1

1

各領域に何らかのdomain_nameフィールドがあると仮定すると、次のようなことができるはずです。

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

必要に応じて、ラムダを使用してnamed_scopeにリファクタリングすることもできます。

于 2010-07-29T22:11:26.357 に答える