6

サブドメインのRyanBatesスクリーンキャストごとにRails3でサブドメインを設定しようとしています。しかし、それは私にとってはうまくいきません。私は次の設定をしています:

# routes.rb
constraints(Subdomain) do
  get 'devices' => 'devices#all'
end

# lib/subdomain.rb
class Subdomain
  def self.matches?(request)
    # binding.pry
    request.subdomain.present? && request.subdomain == "admin"
  end
end

URLadmin.localhost:3000/devicesをロードすると、にルーティングされdevices#allますが、ルーティングエラーが発生しますRouting Error No route matches [GET] "/devices"。明らかにルーティングが機能していません。

pryコメントが上にあるデバッグセッションを設定し、それがヒットしたため、制約は機能していますが、次の出力が得られます。

[1] pry(Subdomain)> request.subdomain
=> ""
[2] pry(Subdomain)> request.subdomains
=> []
[3] pry(Subdomain)> request.host
=> "admin.localhost"

したがって、railsはURLのadmin部分を取得して、それをサブドメイン変数に配置していません。ホスト値を使用して管理ルートにフィルターをかけるのは簡単ですが、クリーンで正しい状態を維持したいと思います。

Railsがサブドメインの値を設定していないのはなぜですか?


編集

jdoecoreywardはどちらも正解です。私を失望させたのは、私もサイトにアクセスして使用powxip.ioていて、同じエラーが発生したことでした。tld> 1であるため、これは奇妙なことでしたhttp://admin.app_name.192.168.1.68.xip.io/devices。何が起こっていたのかというと、のサブドメインはxipでしたadmin.app_name.192.168.1.68。これも一致ロジックを指定すると失敗し、ルーティングされません。

4

2 に答える 2

12

Railsが考える限り、サブドメインは存在しないためです。

Rails では、1 つ以上のドットを持つ TLD のトップレベル ドメイン(TLD) の長さを指定する必要があります。たとえばbbc.co.uk、TLD の長さを 2 に指定しない限り、「bbc」をサブドメインとして取得する場合、サブドメインは空白になります。

request.subdomain(2) #=> ""

これが、空の配列が返される理由でもあります。subdomains最後の 2 つのセグメントは自動的に破棄されます。TLD の長さを指定0して「admin」を取得することもできますが、そのコードは本番環境で実際のドメイン名を使用すると壊れてしまうため、お勧めしません。

アプリがサブドメインを適切に検出できるように、localhost 経由でコンピューターに戻される admin.yourapp.dev のようなドメインを使用することをお勧めします。/etc/hosts を編集するだけで簡単に実行できます。

興味のある方は、メソッドの Rails ソースを以下に示しsubdomainます。

于 2012-06-15T19:10:27.890 に答える
7

特別なアドレスを使用してみてください: http://admin.lvh.me:3000/devices

または設定:

config.action_dispatch.tld_length = 0

を development.rb に追加して、アプリを再起動します。

于 2012-06-15T19:10:08.850 に答える