WEBサービス創造記

WEBサービスを作ったり保守したりしてる人のメモブログです。

Rails3でサブドメインを利用したルーティングを設定する

      2015/05/24

ルートの定義

Rails3ではサブドメインを絡めたルーティングを設定することができる。

Webアプリの開発ではエンドユーザへ公開するフロント部分とは別にアクセス制限のかかったシステムのコントロールパネル(管理画面)が用意されている場合が多い。
仮に管理画面のリソースのnamespaceに”admin”を用いるとして、”admin.domain.tld”へアクセスした場合はこのnamespaceへルーティングするように設定することができる。

設定の方法は簡単で、routes.rbでconstraintsにsubdomainを指定するだけでOK。
例えば、以下のように追記する。

match "admin_login", :to => "admin/session#new", :via => :get, :constraints => {:subdomain  => "admin"}

以下のようにブロックを用いて書くこともできる。

namespace :admin do
  constraints :subdomain => "admin" do
    match "login", :to => "session#new", :via => :get
    match 'login', :to => "session#create", :via => :post
    match 'logout', :to => "session#destroy", :via => :delete

    match "/", :to => "top#index", :via => :get, :as => :admin_root

    resources :users
  end
end

しかし、ローカルでの開発(localhost)ではサブドメインを利用することができない。
これを解決する手段は次に示す。

ローカルホストでのサブドメイン有効化

外国の誰かがlvh.meというドメインをローカルでの開発用に提供してくれているので、ここではこれをありがたく使わせてもらう。
このlvh.meは127.0.0.1( = localhost)に向けられている。

$ ping lvh.me
PING localhost (127.0.0.1): 56 data bytes

したがって、/etc/hostsにてこのドメインをローカルホストに紐付ければOK。

$ sudo vi /etc/hosts/
127.0.0.1	localhost lvh.me admin.lvh.me

/etc/hostsへの記述は不要です。iwaimさんから下記のようにご指摘いただきました。ありがとうございました。

lzh.meとそのサブドメインは、既に127.0.0.1を返すように設定されています。したがって、わざわざhostsを
書き換える必要はありません。

これで admin.lvh.me:3000 のようにホスト名を変更すればサブドメインが有効となる

http://pastebin.com/GUrn7vvE

参考資料

 - Ruby on Rails , , ,