Ruby
Rails
Railsチュートリアル

Railsチュートリアル経験者が引っかかりやすい、Railsのページが表示できないトラブル


概要

Railsチュートリアルを完了して、さあイチからアプリ作成に取り掛かろうとしたところ、

rails serverでサーバーを起動してもブラウザから表示できない。


表示できない理由

どうやら、接続を受け付けるIPアドレスがlocalhostのみとなっていることが原因。


今回

# rails s

=> Booting Puma
=> Rails 5.1.7 application starting in development
=> Run `rails server -h` for more startup options
Puma starting in single mode...
* Version 3.12.1 (ruby 2.5.1-p57), codename: Llamas in Pajamas
* Min threads: 5, max threads: 5
* Environment: development
* Listening on tcp://localhost:3000
Use Ctrl-C to stop


Railsチュートリアル時

# rails s      

=> Booting Puma
=> Rails 5.1.7 application starting in development
=> Run `rails server -h` for more startup options
Puma starting in single mode...
* Version 3.9.1 (ruby 2.5.1-p57), codename: Private Caller
* Min threads: 5, max threads: 5
* Environment: development
* Listening on tcp://0.0.0.0:3000
Use Ctrl-C to stop

* Listening onの項目が、Railsチュートリアル時にはtcp://0.0.0.0:3000だったのに、

今回はtcp://localhost:3000となっている。

* Listening on 〜の箇所は、Railのサーバーが接続を受け付けるIPアドレスを表している。

ここに記載されたIPでないと接続してもページは表示されない。

* Listening on tcp://localhost:3000

この場合には、localhostからの接続のみを受け付けている。

自分はDockerでRails環境を構築していたので、localhostとは見なされなかったようですが、

環境によっては普通に使えるかも知れません。

* Listening on tcp://0.0.0.0:3000

0.0.0.0は全てのIPアドレスを意味する。

なのでこの場合は、どのIPアドレスからでも接続できることを意味する。


解決方法


その1 rails server のbindオプションを使う。

railsサーバー起動時にbindオプションを使えば、リスニングするIPを指定することができる。

rails server --bind=0.0.0.0 もしくは rails s -b 0.0.0.0


その2 config/boot.rb書き換える

毎度bindオプションを指定するのが面倒ならば、config/boot.rbでデフォルト設定を変更するという方法もあるらしい。

rails s -b 0.0.0.0が面倒な場合のメモ - Qiita


その3 gem 'puma'のバージョンを変える

そもそも何故Railsチュートリアルの時には、bindオプションを指定しなくても良かったのか?

config/boot.rbを書き換えてもいない。

調べてみると、Gemfileを書き換えてbundle updateを実行した後は、

デフォルトで* Listening on tcp://0.0.0.0:3000となっているようだ。

なので、Gemfileで指定したgemのどれかが、デフォルトのリスニングIPアドレスの設定を変えているはず。

もっとも可能性の高そうな、gem 'puma'だけをRailsチュートリアルと同じ'3.9.1'にし、bundle update。


Gemfile

source 'https://rubygems.org'

git_source(:github) do |repo_name|
repo_name = "#{repo_name}/#{repo_name}" unless repo_name.include?("/")
"https://github.com/#{repo_name}.git"
end

# Bundle edge Rails instead: gem 'rails', github: 'rails/rails'
gem 'rails', '~> 5.1.7'
# Use sqlite3 as the database for Active Record
gem 'sqlite3'
# Use Puma as the app server
gem 'puma', '3.9.1'



結果、デフォルトのリスニングIPアドレスが変わっていることが確認できた。


補足

Railsのバージョンが4.2になった時、デフォルトのリスニングIPアドレス設定が変わったということがあったらしい。

rails sで起動したサーバにブラウザからアクセスできない - Qiita