困ったこと
Railsアプリを開発していて、スマホでの動きはブラウザの開発環境でスマホにして見るくらいしかできないと思い込んでいた。
stagingにデプロイする前にスマホで見られたら便利なのに...と思ってたら、そうか、できるんですね。
実装!
操作自体は簡単。
-
Railsアプリ
rails s -b 0.0.0.0
で起動 -
PCのIPアドレスを確認。
macはシステム設定
→ネットワーク
→接続されているWiFiなどの詳細に書いてある。 -
PCと同じネットワークに繋がっているスマホで、Chromeなどのブラウザを開いて、そのIPアドレスにポート番号を付与してアクセス。
仕組みを理解する
まずrailsサーバーを起動するところがいつもと違うので頭を整理。
-bオプションを使っている。
→ rails s -b 0.0.0.0
=> Booting Puma
=> Rails 6.1.3.1 application starting in development
=> Run `bin/rails server --help` for more startup options
Puma starting in single mode...
* Puma version: 5.2.1 (ruby 2.7.2-p137) ("Fettisdagsbulle")
* Min threads: 5
* Max threads: 5
* Environment: development
* PID: 29403
* Listening on http://0.0.0.0:3000
Use Ctrl-C to stop
普通のrails sはこう↓。Listening on
の箇所が違う。
→ rails s
=> Booting Puma
=> Rails 6.1.3.1 application starting in development
=> Run `bin/rails server --help` for more startup options
Puma starting in single mode...
* Puma version: 5.2.1 (ruby 2.7.2-p137) ("Fettisdagsbulle")
* Min threads: 5
* Max threads: 5
* Environment: development
* PID: 30030
* Listening on http://127.0.0.1:3000
* Listening on http://[::1]:3000
Use Ctrl-C to stop
rails sの-bオプションとは?
バインドするIPアドレスを指定できるらしい。
「バインドする」なんて普段言わないからよくわからないけど、「巻き込む」くらいなイメージでいればいいのかな?
何も指定しなければデフォルトは127.0.0.1(localhost)なのだろう。127.0.0.1とは自分自身を意味する特別なIPアドレスだから、つまり自分自身のみ巻き込む。自分自身しか見られない。
では、0.0.0.0とは?
IPアドレス0.0.0.0とは?
教えて、Wikipediaさん。
サーバにおいては、0.0.0.0は「ローカルマシン上の全てのIPv4アドレス」を意味する。ホストに192.168.1.1と10.1.2.1の2つのIPアドレスがあり、そのホストで実行されているサーバが0.0.0.0で待ち受けするように構成されている場合、どちらのIPアドレスに対しても到達可能になる。
Wikipediaより
つまり、手元のPC(僕の場合mac)にある全てのIPv4アドレスということか。全てのIPアドレスとは、具体的には上記手順2で確認した192.168.X.Xや、自分自身を指す127.0.0.1のことなのかな??
つまり、rails s -b 0.0.0.0とはローカルマシン上の全てのIPv4アドレスを巻き込んで、Railsサーバーを立ち上げますよ、ということ?
Wikipediaさんの言葉を借りるともっとわかりやすくて、Railsサーバーを立ち上げて、ローカルマシン上の全てのIPv4アドレス(192.168.X.X、127.0.0.1)で待ち受けますよ、ということなのだろう。
好奇心1:自分のIPv4アドレスでも自分のRailsサーバーに接続できる?
ここで新しい好奇心が湧いてくる。
127.0.0.1またはlocalhostで自分が起動しているRailsサーバーにアクセスできることは自明だけど、果たして192.168.X.Xでも自分自身に接続できるのか。
答え→できる。
ややこしいが、人間の名前に例えると分かりやすいかも。
127.0.0.1とは一人称、つまり「俺」とか「私」ということなのだろう。
山田さんと鈴木さんがいたとする。
山田さんは自分のことを「俺(127.0.0.1)は...」と喋る。それは山田さん自身を指す。それ以外にも山田さんは自分で「山田(192.168.X.X)は...」と喋ることもあるだろう。それでも自分自身のことを指しているというのはわかる。
一方、相手の鈴木さんは山田さんを指したい場合は、「俺は...」ではなく「山田(192.168.X.X)は...」としないといけない。
これと同じことではないだろうか。
これは今回の例で言えば、山田さんがPC、鈴木さんがスマホ。
この好奇心1の実験は、山田さんが一人称「俺は」ではなく、「山田は」と喋ったようなものなのだろう。
好奇心2:rails s -b 192.168.X.X
とするとどうなる?
ここでさらに好奇心が。rails s -b 192.168.X.X
と自分のIPアドレスをバインドするとどうなるのか?
→ rails s -b 192.168.10.102
=> Booting Puma
=> Rails 6.1.3.1 application starting in development
=> Run `bin/rails server --help` for more startup options
Puma starting in single mode...
* Puma version: 5.2.1 (ruby 2.7.2-p137) ("Fettisdagsbulle")
* Min threads: 5
* Max threads: 5
* Environment: development
* PID: 30149
* Listening on http://192.168.10.102:3000
Use Ctrl-C to stop
こうすると、PCで127.0.0.1:3000やlocalhost:3000は見られない。
192.168.X.X:3000は見れる。(スマホからも192.168.X.X:3000で見られる。)