Devise 4.9系への依存を固定してFormtasticの問題を回避
ActiveAdmin 8.1では、Devise の依存を ~> 4.9 に固定しました。これはFormtasticが Proc 型のバリデーションオプションを適切に処理できない問題 formtastic/formtastic#1401 に起因します。
背景
Devise 5.0では、パスワード長のバリデーションが Proc を使用する形式に変更されました(heartcombo/devise#5734)。具体的には、validates_length_of の minimum と maximum オプションが静的な値から Proc による動的な値に変わっています。
# Devise 4.x
validates_length_of :password, minimum: password_length.min, maximum: password_length.max, allow_blank: true
# Devise 5.0
validates_length_of :password, minimum: proc { password_length.min }, maximum: proc { password_length.max }, allow_blank: true
この変更により、Formtasticが生成するHTML要素の maxlength 属性が #<Proc:...> という文字列になってしまう問題が発生しました。Formtasticは Proc オブジェクトを評価せずにそのまま文字列化してしまうため、ブラウザのバリデーションが機能せず、場合によってはパラメータの欠損も引き起こします。
技術的な変更
各Railsバージョン用のGemfileで、Deviseの依存指定を変更しました。
変更内容:
- gem "devise"
+ gem "devise", "~> 4.9" # TODO: relax this dependency when formtastic/formtastic#1401 will be fixed
この変更は以下のGemfileに適用されています:
-
Gemfile(Rails 8.1用) gemfiles/rails_70/Gemfilegemfiles/rails_71/Gemfilegemfiles/rails_72/Gemfilegemfiles/rails_80/Gemfile
Rails 6.1用のGemfileには変更がありません。これは元々Devise 4.x系が使用されているためです。
各ロックファイルも更新され、Devise 4.9系が確実にインストールされるようになっています。同時に、関連する依存ライブラリ(cucumber-*、parser、prism、rdoc、rubocop など)も最新版に更新されました。
テストインフラの改善
Bundlerバージョンの差異を許容するテストの修正 も同時に取り込まれています(#8920 のバックポート)。
spec/tasks/gemfile_spec.rb に strip_bundled_with ヘルパーメソッドが追加され、Gemfile.lock の比較時に BUNDLED WITH セクションを除外するようになりました。
def strip_bundled_with(lockfile_content)
normalized = lockfile_content.gsub(/\r\n/, "\n")
normalized.gsub(/\n?BUNDLED WITH\n.*\z/m, '').strip
end
このヘルパーは改行コードの正規化と BUNDLED WITH セクションの削除を行います。これにより、開発者間でBundlerのバージョンが異なっていてもテストが失敗しなくなります。テストの本来の目的である「依存関係の実質的な変更の検出」に集中できる設計です。
設計判断
Devise 5.0へのアップグレードを見送り、4.9系に留める判断が下されました。PR本文のTODOコメントが示すように、これは一時的な対応と位置づけられています。
Formtastic側での修正が完了するまで、ActiveAdminはDevise 4.9系を使用し続けることで、既存のフォーム生成機能の安定性を維持します。~> 4.9 という指定により、パッチレベルの更新は受け入れつつ、マイナーバージョンアップは防ぐ設定です。
テストインフラの改善を同時に取り込むことで、依存管理の手間を減らしながら、実質的な依存変更を確実に検出する体制を整えています。
本PRは、上流ライブラリの問題に対する実用的な回避策と、開発体験の向上を両立させた対応です。Formtasticの修正完了後にDevise 5.0への移行が予定されており、段階的なアップグレード戦略を取っています。