以下の内容はhttps://motohiro-mm.hatenablog.com/entry/2024/12/08/110117より取得しました。


Rails7.2でChromeDevToolsのデバイスモードを変更して操作するとエラーが出る[Ruby on Rails]

はじめに

フィヨルドブートキャンプで学習しています、もとひろです!
今回は、Rails7.2で起こるGoogleChromeの開発者ツール(以下devツール)でのエラーについて書きたいと思います。

フィヨルドブートキャンプで実施しているAdventCalendarの記事です。
フィヨルドブートキャンプ Advent Calendar 2024 Part2」の8日目を担当しています。

Part1→フィヨルドブートキャンプ Part 1 Advent Calendar 2024 - Adventar
昨日はkyokucho1989さんの「時間とたたかうフィヨルドブートキャンプ 」でした。
Part2→フィヨルドブートキャンプ Part 2 Advent Calendar 2024 - Adventar
昨日はsugiweさんの「bootcampアプリにissueを立てるのが楽しい話」でした。

概要

Chrome のdevツールでデバイスモードを変更して操作しようとすると406エラーが出ます。
Rails7.2でデフォルトで設定されているallow_browser versions: :modernによるものです。

環境

Rails:7.2.2
Ruby:3.3.5
Chrome:131.0.6778.108

詳細

状況

Rails7.2で$ rails newしたアプリケーションを起動します。
rails new、scaffold、migrateのみ実行し、作成されたコードをそのままサンプルとしています)
通常のChromeの画面では問題なく操作できています。

youtu.be

devツールでデバイスモードを設定します。
今回の動画では、iPhone14 Pro Maxに設定しました。
この状態で操作しようとすると、406エラーが表示されます。
リロードしてもエラーが変わりません。

youtu.be

原因

Rails7.2で$ rails newを実行すると、デフォルトでブラウザのバージョン保護機能が追加されています。
Ruby on Rails 7.2 リリースノート - Railsガイド

# app/controllers/application_controller.rb

class ApplicationController < ActionController::Base
  # Only allow modern browsers supporting webp images, web push, badges, import maps, CSS nesting, and CSS :has.
  allow_browser versions: :modern  ←これです
end


allow_browser versions:で設定されているバージョン未満のブラウザでサービスにアクセスした場合、406エラーを返すようになっています。
406エラーに関してはこちらを参考にしてください↓
406 Not Acceptable - HTTP | MDN

:modernで設定されるバージョンは以下のとおりです。
ActionController::AllowBrowser::ClassMethods

Chromeのdevツールでデバイスを変更してサービスを表示すると、例えばiPhoneであればSafariでアクセスすることになります。
Chromeのdevツール内のSafariChromeのバージョンは低いです。

現時点でのChromeのdevツールで確認できる代表的なデバイスでバージョンを調べました。
devツールのコンソールでconsole.log(navigator.userAgent);と入力すると調べることができます。
(2024/12/7 Chrome: 131.0.6778.108)

iPhone14 Pro Max:Safari 16.6 Mozilla/5.0 (iPhone; CPU iPhone OS 16_6 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.6 Mobile/15E148 Safari/604.1

iPhoneSE:Safari 16.6Mozilla/5.0 (iPhone; CPU iPhone OS 16_6 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.6 Mobile/15E148 Safari/604.1

Pixel 7:Chrome 116.0.0.0Mozilla/5.0 (Linux; Android 13; Pixel 7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Mobile Safari/537.36

Samsung Galaxy S20 Ultra:Chrome 116.0.0.0Mozilla/5.0 (Linux; Android 13; SM-G981B) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Mobile Safari/537.36

:mordenの基準に達していないのでサービス対象外となり、操作時に406エラーが表示されていました。

$ rails newした時点でデフォルトで406エラーページが作成されています↓
/public/406-unsupported-browser.html
406-unsupported-browser.htmlを削除していると500エラーでページが表示されます。

ちなみに、細かい調査はしていませんが、
FireFoxでもdevツールでデバイスを変更し操作すると同じように406エラーが表示されます。

私が行った対応

今回私がこのエラーに遭遇したのは、FBCのプラクティスにある自作サービスを作成している際だったので、メンターさんと相談し、開発作業中は一旦allow_browser versions: :modernコメントアウトし、リリース前にコメントアウトを外して設定をONにする、という対応をすることになりました。
allow_browser versions: :modernコメントアウトすると、devツールでデバイスを変えて操作できるようになります。

youtu.be

そのプロジェクトごとに開発・本番環境が異なると思いますので、それに合わせた対応が必要かと思われます。

参考リンク

余談

Rails8.0でもデフォルトで同じ設定が含まれるので406エラーが出ます。
ですが、406エラーページのレイアウトが違いました。

Rails7.2の406エラー画面
Rails8.0の406エラー画面
個人的にRails8.0の406ページがかわいいなと思ったのですが、みなさんはどう思いますか?😄

おわりに

間違い・ご意見等ありましたらコメントいただけたら幸いです。

アドカレこのあとも楽しみにしています!




以上の内容はhttps://motohiro-mm.hatenablog.com/entry/2024/12/08/110117より取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14