最近日本からオーストラリアに帰国しました!新しい会社でまたRails5.1に更新しました。
今回成功しましたが、何で日本の会社でやった時にできなかったとか色々分かってきました!
rspec使っている?
正直に言うと、日本で働いてたの会社で「rspec」のテストが足りませんでした、手動でテストだけでRails更新するのはとても難しいです。自動テストがシステムの少なくとも80%をカバーしていない場合は、問題が起こりやすいと思います、ご注意ください!(システムがrspecを使ってない場合はほぼ無理です、rspec使ってください。)
更新の前に
今のプロジェクトはバーション5.0を使っているの確認。そして、rpsec が80%以上システムテストしている状態。
今の使っているgemが更新の後でまだ使えるかどうかのチェック、
next_rails の gem を使って、5.1.7 までにチェックができます。
ターミナルで gem install next_rails を使いましょう。
バーション5.1.7 に更新したいから、bundle_report compatibility --rails-version=5.1.7 で使っているgemはまだ使えるかどうかnext_railsが教えてくられます。
エラーとか合ったら、エラー起こっているのgemを使えないって言うことになってしまったので、使えなくなったgemは使わないように、プロジェクトを変更しなきゃあかん。
問題ない場合は、進みましょう。
Gemfile
Gemfileの中に2つのライン更新しましょう。
gem "rails", "5.0.x.x" -> gem "rails", "5.1.7"
gem "activejob", "5.0.x.x" -> gem "activejob", "5.1.7"
そしてターミナルに bundle exec rails app:update でいけます!
これはちょっと時間がかかりますが、変わったのファイル全部ご確認してください。
自動で消されてしまうファイルとコードたまにあるので注意ください。
特に
config/environments/ の中
bundle と secrets.yml が消されてしまうかも、これは自分のプロジェクト元々に戻そう!
など、、、
簡単?
おめでとう、もう5.1.7に更新できました!!!
けど、、エラーが、、
たくさんエラーが出ました!?!
5.1からたくさん使えなくなること、変わったこともあるので、rspec 使ったら多分たくさんエラーと注意も出たはずです。
before_action と after_save などのフローが変わったし、_changed? なども使えなくなるやし、これから大変そうですが、ちょっとずっつでコードの更新も行きましょう。
after_create+after_update+after_なんちゃら の中に
| 修正前 | 修正後 |
|---|---|
| attribute_changed? | saved_change_to_attribute? |
| attribute_change | saved_change_to_attribute |
| attribute_was | attribute_before_last_save |
| changes | saved_changes |
| changed? | saved_changes? |
| changed | saved_changes.keys |
| changed_attributes | saved_changes.transform_values(&:first) |
before_create+before_save+before_なんちゃら の中に
| 修正前 | 修正後 |
|---|---|
| attribute_changed? | will_save_change_to_attribute? |
| attribute_change | attribute_change_to_be_saved |
| attribute_was | attribute_in_database |
| changes | changes_to_save |
| changed? | has_changes_to_save? |
| changed | changed_attribute_names_to_save |
| changed_attributes | attributes_in_database |
Hashを使っている時に.uniqが使えなくなったので.uniq -> .distinct に変更も必要です、Arrayの時にしないでね!
Hashに.compactも使えなくなった、変わりに.delete_if { |_k, v| v.blank? }使いましょう。
previous_changes は使えなくなったので、合ったら違うロジックでコードやり直ししかないです。
テスト、テスト、テスト、
全部の先に言った更新だけで、エラーはもう消えたはずですが、rspec で自動テスト数回使って、エラーないを確かめて見てください。
docker-compose run web bundle exec rspec
エラー合ったら、spec の1個ずっつテストして直しましょう!
頑張ってね!
なんか質問合ったら、是非聞いてください。