Active Storage未使用時のstorage関連エントリをgitignoreから除外
この変更により、Active Storageをスキップし、かつデータベースがSQLite3以外の場合、生成される.gitignoreと.dockerignoreからstorage関連のエントリが除外されるようになりました。これにより、存在しないディレクトリに対する冗長な無視設定が削除され、生成ファイルの一貫性が向上します。
背景
rails newコマンドで--skip-active-storageと--database=postgresqlを同時に指定すると、skip_storage?メソッドがtrueを返します。この条件下では、アプリケーションジェネレータはstorage/とtmp/storage/ディレクトリを作成しません。
しかし、#53413で報告されたように、生成される.gitignoreファイルには存在しないこれらのディレクトリに対する無視設定が含まれていました。.gitignoreは既に--apiオプション指定時の/public/assetsや--skip-keeps指定時の.keepファイルなど、他のオプションに応じた条件付き除外を実装していましたが、storage関連のエントリには同様の対応がありませんでした。
技術的な変更
railties/lib/rails/generators/rails/app/templates/gitignore.ttとdockerignore.ttに、storage関連エントリをskip_storage?条件で囲む変更が追加されました。
変更後:
<% unless skip_storage? -%>
# Ignore storage (uploaded files in development and any SQLite databases).
/storage/*
!/storage/.keep
<% if keeps? -%>
/tmp/storage/*
!/tmp/storage/
!/tmp/storage/.keep
<% end -%>
<% end -%>
この変更により、以下の2つの条件を満たす場合にのみ、storage関連のエントリが.gitignoreに含まれます:
- Active Storageがスキップされていない、または
- データベースがSQLite3である(
skip_storage?がfalseを返す)
テストケースも追加され、Active Storageをスキップした場合とPostgreSQLを指定した場合の両方の動作が検証されています:
def test_gitignore_does_not_append_storage_entries_when_active_storage_is_skipped_and_database_is_not_sqlite
generator [destination_root], ["--skip-active-storage", "--database=postgresql"]
run_generator_instance
assert_file ".gitignore" do |content|
assert_no_match(%r{storage/}, content)
end
end
.dockerignoreにも同じパターンの変更が適用され、Dockerイメージビルド時の一貫性も保たれます。
設計判断
既存の条件付きエントリ生成パターンを踏襲する形で、skip_storage?メソッドによる分岐が選択されました。
skip_storage?は既にapp_generator.rbでディレクトリ作成の制御に使用されており、このメソッドを.gitignore生成でも再利用することで、ディレクトリの存在とgitignoreエントリの間に一貫性が保たれます。SQLite3の場合は、Active Storageを使用していなくてもデータベースファイルの無視設定が必要なため、skip_storage?がfalseを返す設計になっています。
このアプローチにより、新しい条件判定ロジックを追加することなく、アプリケーション生成時の既存の判断基準をそのまま活用できています。
本変更は、生成されるファイルの内容をアプリケーション構成と正確に対応させることで、開発者が不要なエントリに気を取られることを防ぎます。特にActive Storageを使用しないプロジェクトでは、実際には存在しないディレクトリへの参照が.gitignoreから消えることで、設定ファイルの可読性が向上します。