どうもこんにちは、今回はRuby on Railsのバージョンアップ作業を行なった時にぶつかった壁について紹介します。
基本的な手順
基本的な手順は、こちらの記事を参照して行いました。
バージョンアップの経緯
私の会社では、WebアプリケーションをAWS ElasticBeanstalkを使用してデプロイ/運用を行っています。
しかし、近々ElasticBeanstalkのRails5系のサポートが終了するとの警告があり、「これはバージョンを上げないとやばい!」ということで上げることになりました。
ぶつかったこと
バージョンアップ作業自体は順調でした。RSpecやRubycop、Brakemanを導入していたおかげエラー箇所や冗長なコードを見つけるのがかなり容易でした。しかし、そのような自動テストではカバーできない問題に陥ってしまいました。
それが、Javascript、CoffeeScriptが動かない! という問題です。
厳密にいうと、動かないという問題だけで2種類の問題がありました。
- Rails7.0.6へ上げた後に
rails s
でサーバーを立ち上げたら、Javascript、CoffeeScriptが全く動かないという問題。 - Rails5.2.8時点で実装していたJavascript、CoffeeScriptは動くが、Rails7.0.6時点でJavascript、CoffeeScriptを修正しても修正内容がlocalhost上に反映されないという問題
1つ目は簡単でした。JavaScriptのハンドリングには、Rails5ではsprocketsが、Rails7ではimportmapが使用されていました。これでは、Rails7でJavascript、CoffeeScriptが動く訳ないですね。なので、Gemにsprockets-rails
を導入することにしました。
1. Gemfileに`gem 'sprockets-rails'`を記載
2. `bundle install`を実行
3. 念の為、もう一度`rails s`を叩く
これでJavascript、CoffeeScriptが動き始めました。
しかし問題は2つ目です。
エラーも出ず、ただただconsole.log
でログ出力されないという問題が目の前にあるだけ。これはなんだろうと思い、調査をしました。そしたら、設定が足りないという凡ミスでした。
-
config/application.rb
にrequire "sprockets/railtie"
を記述 -
config/initializers/assets.rb
に以下を記述
Rails.application.config.assets.paths << Rails.root.join('app', 'assets', 'javascripts')
Rails.application.config.assets.paths << Rails.root.join('app', 'assets', 'coffeescripts')
あとはもう一度rails s
を叩けばOKです!
うまくいかなかった場合
-
app/assets/javascripts/application.js
に//= require users
というようにrequireする記述をスクリプトファイルの数だけ追加してみてください。 -
public/assets
ディレクトリをクリアして、rails assets:precompile
を実行してみてください。
まとめ
Ruby/RailsのアップグレードではJavaScript周りの作りは複雑なので、根気強く調査して頑張る!
バージョンアップ作業で困っている方をお助けできてたら嬉しいです。
以上