そろそろ、転職活動に向けてポートフォリオアプリを作成しようと思い、ユーザー管理のために Devise を導入しました。
Rails 8で新しくアプリを作成し、ログインページを作ろうとしたところ、/users/sign_in
にアクセスしても画面が表示されず、「406 Not Acceptable」エラーが発生しました。
この問題は、Rails 8から追加されたブラウザ制限機能 allow_browser
によるもので、ローカル開発中でも発生するようです。
使用環境
- Ruby 3.4.2(rbenv)
- Rails 8.0.2
- Node.js 18.x(nvm)
- PostgreSQL
- Devise
Railsアプリ作成
rails new my_app -d postgresql --css bootstrap
cd my_app
Devise 導入
bundle add devise
bin/rails generate devise:install
bin/rails generate devise User
bin/rails db:create db:migrate
/users/sign_in
にアクセス → 406エラー発生
Railsサーバー起動後に以下のURLへアクセスする
http://localhost:3000/users/sign_in
画面は表示されず、サーバーログに以下が出力される。
Rendering public/406-unsupported-browser.html
Completed 406 Not Acceptable
原因:Rails 8 のallow_browser
によるアクセス制限
Rails 8では、特定のUser-Agent(古いブラウザや不明なもの)を拒否する
allow_browser
機能がデフォルトで有効になっている。
ローカル開発中であっても、IPv6などでアクセスするとUser-Agentが不明とされ、拒否されてしまう。
解決方法
config/environments/development.rb
を編集
次の1行をRails.application.configure do
ブロックの末尾に追加する。
config.action_dispatch.allow_browser = ->(user_agent) { true }
サーバー再起動
# サーバーを停止
Ctrl + C
# サーバー再起動
bin/dev
# または
rails server
再度アクセス
http://localhost:3000/users/sign_in
ログインページが正しく表示されれば成功。
まとめ
内容 | 対処法 |
---|---|
ログインページが406で表示されない |
allow_browser = -> { true } を追加 |
修正後も変化なし | サーバーの再起動が必要 |
本番環境では? | 特定の古いブラウザだけ除外する設定を推奨 |