1. ホーム
  2. ruby-on-rails

[解決済み] gemのアップデート後、"Asset was not declared to be precompiled in production "でテストが失敗する。

2022-02-08 16:06:01

質問内容

いくつかのgemsをアップデートしてから、すべてのテストがエラーで失敗するようになりました。

ActionView::Template::Error: アセットがプリコンパイルされるように宣言されていません。 を実行します。

追加 Rails.application.config.assets.precompile += %w( favicons/manifest.json.erb ) から config/initializers/assets.rb を実行し、サーバーを再起動します。

app/views/layouts/_faviconsheader.html.erb:14:in。 _app_views_layouts__faviconsheader_html_erb__1320

app/views/layouts/application.html.erb:21:in。 _app_views_layouts_application_html_erb__4340

このエラーは、部分的な _faviconsheader.html.erb という行が含まれています。

<%= content_tag :link, nil, rel: :manifest, href: image_path("favicons/manifest.json.erb") %>

このパーシャルが読み込まれるのは application.html.erb : <%= render partial: 'layouts/faviconsheader' %> .

このエラーの原因と対処法に心当たりはありますか? gemのアップデート前はすべてのテストに合格していました。

Rails 4.2.5を使用しています。更新されたgemsの1つは sprockets (sprockets をバージョン 3.5.2 に更新しました)。私は何かで読んだ ギズーブ sprockets 4に問題があるとのことですが、私はバージョン4を使っていません。


追記 Rails.application.config.assets.precompile += %w( favicons/manifest.json.erb )config/initializers/assets.rb というエラーが出ます。しかし、たとえそれがうまくいったとしても、いくつかのgemsを更新した以外は何も変更せずに、なぜこの問題が発生したのかを理解したかったのです。

解決方法は?

長文回答+解説

エラーメッセージで推奨されているように、プリコンパイルされたアセットにファイルを追加することが正しい修正方法だと思います。実行時にレンダリングする必要があるerbファイルがあるため、この方法では問題を解決できないのかもしれません。もしそのファイルが静的なjsonファイルであれば、プリコンパイルされたアセットに追加しても問題は発生しないと想像しています。

を使用する場合 image_path ヘルパーは、Sprockets が静的アセットを持っていることを想定しています。の前にアプリがエラーを出さなかったのは、そのためです。 sprockets-rails 3.0はやや意外です。この新しいバージョンは、どうやら標準を実施する上で、より良い仕事をしているようです。(また、3.0には他の問題もあるようで、間もなく更新されるかもしれません)

マニフェスト内にerbが必要な場合、ルートパスヘルパーを使用するのがベストプラクティスでしょう。 image_path または asset_path を使用してurlを取得します。この場合、マニフェストルートを config/routes.rb ファイルを作成し、コントローラアクションでその json ファイルをレンダリングします。ビューファイルは、あなたの .erb マニフェストを作成します。


短い回答

を実行した後、この現象が発生するようになりました。 bundler update を変更したことで sprockets-rails のバージョンが2.3.3から3.0.0になりました。簡単な修正方法は sprockets-rails をバージョン2.3.3に戻し、Gemfileで bundle install を再度実行します。

gem 'sprockets-rails', '2.3.3'

余談ですが、この問題は開発環境でも発生しており、そこで rake assets:precompile . 残念ながら、私のテストはパスしませんでした。