Devise 4.9系への依存を固定してFormtasticの問題を回避

activeadmin/activeadmin

ActiveAdmin 8.1では、Devise の依存を ~> 4.9 に固定しました。これはFormtasticが Proc 型のバリデーションオプションを適切に処理できない問題 formtastic/formtastic#1401 に起因します。

背景

Devise 5.0では、パスワード長のバリデーションが Proc を使用する形式に変更されました(heartcombo/devise#5734)。具体的には、validates_length_ofminimummaximum オプションが静的な値から 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/Gemfile
  • gemfiles/rails_71/Gemfile
  • gemfiles/rails_72/Gemfile
  • gemfiles/rails_80/Gemfile

Rails 6.1用のGemfileには変更がありません。これは元々Devise 4.x系が使用されているためです。

各ロックファイルも更新され、Devise 4.9系が確実にインストールされるようになっています。同時に、関連する依存ライブラリ(cucumber-*parserprismrdocrubocop など)も最新版に更新されました。

テストインフラの改善

Bundlerバージョンの差異を許容するテストの修正 も同時に取り込まれています(#8920 のバックポート)。

spec/tasks/gemfile_spec.rbstrip_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への移行が予定されており、段階的なアップグレード戦略を取っています。

記事メタデータ

Generated by:
Claude Sonnet 4.5 for DiffDaily

この記事はAIによって自動生成されています。内容の正確性については、必ずソースコードやPRを確認してください。

品質レビュー結果

Review Status:
承認済み
Review Count:
1回
Reviewed by:
Gemini 2.5 Pro for DiffDaily

Review Criteria:

記事構成 ✓ PASS

Title, Context, Technical Detailの存在と明確さ

リード文(総論)→背景・技術的変更・設計判断(各論)→まとめ(結論)という3部構成が明確に適用されており、非常に分かりやすい記事構成です。

カスタムMarkdown構文 ✓ PASS

シンタックスハイライト・GitHubリンク記法の正確性

ファイル名付きシンタックスハイライト(`diff:gemfiles/rails_71/Gemfile`)やGitHubのPR・Issueへのリンク記法が正しく使用されています。

対象読者への適合性 ✓ PASS

エンジニア向けの適切な技術レベルと表現

Devise, Formtastic, Bundlerといった技術要素について、専門知識を持つエンジニアを対象とした適切なレベルの解説が行われています。

パラグラフ・ライティング ✓ PASS

トピックセンテンス・1段落1トピック・段落長

各セクションが総論→各論の構成になっており、各段落はトピックセンテンスで始まるなど、パラグラフ・ライティングの原則が守られています。可読性が非常に高いです。

Diff内容との照合 ✓ PASS

コードブロックとDiff内容の一致

記事内で引用されているGemfileとspecファイルのコードは、提供されたDiffの内容と正確に一致しています。変更が適用されたファイル群についての言及も正確です。

技術用語の正確性 ✓ PASS

技術用語の正確な使用

`Proc`, `validates_length_of`, `~> 4.9` (Pessimistic Version Constraint) などの技術用語が文脈に応じて正確に使用されています。

説明の技術的正確性 ✓ PASS

技術的主張の正確性と論理性

Devise 5.0での変更がFormtasticで問題を引き起こすメカニズムや、テストインフラの改善(`strip_bundled_with`)の目的についての説明は、技術的に正確かつ論理的です。

事実の突合 ✓ PASS

PR情報による主張の裏付け(ハルシネーション検出)

記事内のすべての主張(Deviseのバージョン固定、Formtasticの問題、#8920のバックポートなど)は、PRのDescription、Diff、またはDiff内のコメントによって裏付けられており、ハルシネーションは検出されませんでした。

数値・固有名詞の確認 ✓ PASS

PR番号・コミットID・バージョン等の正確性

PR番号(#8930, #8920)、Issue番号(formtastic/formtastic#1401)、バージョン番号(Devise 4.9など)はすべて正確に記載されています。

タイトル・説明との一致 ✓ PASS

記事タイトル・説明とPR内容の一致

PRの汎用的なタイトル「Update dependencies」に対し、記事のタイトル「Devise 4.9系への依存を固定してFormtasticの問題を回避」は、PRの最も重要な変更点を具体的に示しており、内容と完全に一致しています。

外部知識の正確性 ✓ PASS

PRに記載のない外部知識(LTS、サポート状況など)の不使用

DeviseやFormtasticの関連Issueへの言及は、PRのコンテキストを説明するために不可欠な情報であり、PR情報から直接参照できる範囲に留まっています。無関係な外部知識の捏造はありません。

時間表現の正確性 ✓ PASS

時間表現がPR情報と一致しているか

「〜まで使用し続ける」「〜後に移行が予定されて」といった将来の見通しに関する表現は、Diff内のTODOコメントに基づいており、時間的な表現は正確です。