概要
Railsではデフォルトではlocalhost:3000で開発環境にアクセスできますが、
ルーティングをサブドメインで切り替えるテストをしたいなと思った時にハマったので、解決策を示します。
ルーティング
# hostがexample.comの時だけアクセスさせたい
constraints host: example.com do
get 'top', to: 'top#index'
end
新しいドメインを追加する
OSがmacまたはlinuxの場合は、/etcディレクトリに、windowsの場合はC:\Windows\System32\driversに存在するhostsファイルに新しいドメインを追加します。
127.0.0.1 localhost example.com
これで、127.0.0.1というIPアドレスにlocalhostとexample.comというホスト名を設定できました。
Blacked Hostsの設定
Rails6を使用している場合は、アクセス可能なホストにexample.comを追加しましょう。
Blacked HostsはRails6の新機能で、ブラウザがRailsアプリケーションにアクセスする際に使用できるホスト名を制限するためのものです。
デフォルトでlocalhostのみが許可されています。
Rails.application.configure do
config.hosts << "example.com"
end
これで、以下サブドメインにアクセスすることができます。
http://example.com:3000/top
おまけ
ちなみに、blocked_hostsを追加するとrspecが通らなくなるので、rpsec用のホストを追加します。
Spec.describe "Admin::StaffMembers", type: :request do
p admin_staff_members_url
end
結果:
"http://www.example.com/admin/staff_members"
rspecではホストがwww.example.comでアクセスしているようなので、blocked_hostsにwww.example.comを追加します。
Rails.application.configure do
config.hosts << "example.com"
# rspecが通らないので、以下ホストを追加
config.hosts << "www.example.com"
end
これで、テストが通るようになります。