https://github.com/ViewComponent/view_component
view_component 4.11.0 がリリースされました。主な変更は `render_in` メソッドのシグネチャに `**_` を追加し、Rails #50623 との互換性を確保したことです。破壊的変更はなく、既存の利用者への影響はありません。
Rails の `render_in` シグネチャ変更(`**options` の追加)に対応するため、ViewComponent の `Base`・`Collection`・`Instrumentation` の 3 クラスで `render_in(view_context, **_, &block)` へ更新しました。`**_` パターンにより後方互換性を維持しつつ、Rails の新しいレンダリングインターフェースとの整合性を確保しています。
ViewComponentのラムダバックドスロットで `t(".key")` を使用した際に翻訳スコープが中間コンポーネントに解決されていたバグを修正。`__vc_set_slot` 内でブロック定義時の仮想パスをローカル変数に保持し、ラムダブランチの `with_captured_virtual_path` に正しく渡すよう2行の変更で対応しています。
ViewComponent 4.10.0 がリリースされました。`eager_load = true` のテスト環境で発生していた `NameError: uninitialized constant ViewComponent::SystemTestControllerNefariousPathError` を修正した版です。あわせてリリーススクリプトが `BUNDLE_IGNORE_RUBY_VERSION=1` を用いた統一ループに改善されています。
`eager_load = true` でテスト環境を起動すると発生していた `NameError: uninitialized constant ViewComponent::SystemTestControllerNefariousPathError` を、`view_component/errors` の明示的な `require` 追加によって修正しました。あわせて、別プロセスで最小構成の Rails アプリを起動して eager_load の問題を検出する `eager_load_check` Rake タスクを追加し、CI での再発防止を図っています。
ViewComponentがRailsの`form.label`などのフォームヘルパーとyieldブロックを組み合わせた際、ブロックの内容がタグの外側に出力されるバグを修正。根本原因はパーシャルレンダリング時にビューコンテキストの`@output_buffer`が差し替えられる一方、フォームビルダーがコンポーネントの古いバッファに対してキャプチャを行う同期ずれで、`capture`メソッドのオーバーライドで対処しています。
ViewComponent 4.9.0 がリリースされました。`ViewComponentsSystemTestController` に存在したパストラバーサル脆弱性を修正したセキュリティリリースです。`start_with?` による文字列前方一致をディレクトリセパレータを考慮した正確なパス検証に置き換え、不正なパスへのアクセスは未処理の例外ではなく 404 を返すように変更されています。
view_componentプロジェクトにyard-lintを導入し、YARDドキュメントの静的検査をCIパイプラインに組み込みました。.yard-lint.ymlで段階的なルール有効化を設定し、既存の違反を修正してCIをグリーンな状態でスタートさせています。
ViewComponent 4.8.0 がリリースされました。`sidecar_files` メソッドに `name` が `nil` の場合に早期リターンするガード節が追加されたほか、起動時のeagerコンパイルを `ActiveSupport::Notifications` で計測できる `compile.view_component` イベントが導入されています。
ViewComponentのブート時一括コンパイルが `compile.view_component` というActiveSupport::Notificationsイベントとして計測できるようになりました。`config.eager_load = true` の場合に常時発火し、設定不要で起動時のコンパイルコストを可視化できます。変更は `engine.rb` の初期化処理を `instrument` ブロックで囲む最小限の修正です。
ViewComponent 4.7.0 がリリースされました。スロットに `render_in` より前にアクセスした際にコンテンツキャッシュが陳腐化するバグが修正されており、本リリースの変更内容はこの単一のバグ修正のみです。
`render_in` 実行前にスロット述語を呼び出すと `content` のキャッシュが汚染され、レンダリング時に渡したコンテンツブロックがサイレントに無視されるバグが修正されました。`render_in` メソッドに `remove_instance_variable(:@__vc_content)` の1行を追加し、評価済みフラグと合わせてキャッシュ値も完全に削除することで不整合を根本から解消しています。
フォーマット指定なしのテンプレート(`.erb`)を持つコンポーネントを継承すると、子コンポーネントのコンパイル時に `undefined method 'upcase' for nil` が発生するバグを修正。`Template::File` の初期化処理で `details.format` が `nil` の場合に `DEFAULT_FORMAT`(`:html`)を補完するガード節を追加し、警告を出力しつつ動作を継続させる設計が採用された。
`render.view_component` イベントのペイロードに `view_identifier` フィールドが追加され、レンダリングされたテンプレートファイル(`.html.erb` など)のパスを取得できるようになりました。Coverband のようなカバレッジツールがビューテンプレートの使用状況を追跡できるようになります。`around_render` フックを利用して `ensure` ブロックによるリセット前にテンプレートパスを退避する設計が採用されています。
Rails 7.1でZeitwerk一本化に伴い削除された `require_dependency` を標準の `require` に置き換え、モダンなRailsアプリでViewComponentのプレビュー読み込みが失敗する問題を修正しました。変更は `lib/view_component/preview.rb` の1行のみで、影響範囲を最小限に抑えた対応です。
`render?` が `false` を返すコンポーネントの `render_in` が通常の `String` を返していたため、`SafeBuffer` との連結で `TypeError` が発生していた問題を修正。`"".html_safe` を返すよう1行変更し、レンダリングパスとの戻り値の型を統一しました。
ViewComponent 4.5.0がリリースされ、Sprocketsを使用する環境での初期化順序に起因するアセット不足エラーが修正されました。本リリースではバージョン番号の更新と依存関係の更新が行われ、複数のRailsバージョン(7.1、7.2、8.0、8.1、main)に対応したGemfile.lockが個別に管理されています。
ViewComponent 4.0で発生していたSprocketsのアセット読み込みエラーを修正。初期化フックを`after_initialize`から`after_routes_loaded`に変更し、eager loading環境での初期化順序問題を解決しました。
テンプレートアノテーション行の削除処理を改行ベースからセミコロン区切りに変更し、Railsのマルチラインアノテーション形式に対応。正規表現による不完全な除去を解消し、不正なRubyコードの`eval`エラーを防止しています。
Rails 8.1環境でテンプレートアノテーションを無効化した状態でRuby Coverageを実行すると発生していたSegmentation Faultが修正されました。条件分岐を単純化し、Coverage実行時は常に`lineno = 0`とすることで、環境設定の組み合わせによる予期しない動作を排除しています。