Rails3で1つのアプリケーション内に複数ドメインのサービスを提供させる方法

PCとモバイルでドメインを別にしてサービスを提供することもあると思う。
その場合アプリケーションを別にしてもいいのだがモデルを共有したい場合もある。
そういう時はconfig/routes.rbでconstraints指定をしてrequestされたhost名でコントローラを出し分ける。

新規Railsアプリを作成して、名前空間付きで同名のコントローラを生成する。

$ rails -v
Rails 3.2.9

$ rails new yahoo
$ cd yahoo
$ rails generator controller pc::sports
$ rails generator controller mobile::sports

routes.rbにconstraintsブロックを追加してhostの設定をする。

Yahoo::Application.routes.draw do
  constraints :host => "www.yahoo.co.jp" do
    get "sports" => "pc::sports#index"
  end

  constraints :host => "m.yahoo.co.jp" do
    get "sports" => "mobile::sports#index"
  end
end

それぞれのcontrollerで別の表示がされるように調整

PC

class Pc::SportsController < ApplicationController
  def index
    render :text => "PC", :status => 200
  end
end

MOBILE

class Mobile::SportsController < ApplicationController
  def index
    render :text => "MOBILE", :status => 200
  end
end

HOSTS設定をする

127.0.0.1 www.yahoo.co.jp m.yahoo.co.jp

開発サーバを起動

$ rails server

これでブラウザからそれぞれのURLにアクセスすると別ページが表示される

http://www.yahoo.co.jp:3000/sports
http://m.yahoo.co.jp:3000/sports