Just do IT

思うは招く

【Issue振り返り】本番のDBを変更するときの注意

どんな Issue をしたのか

実現したいこと

  • 誰でも作成できるドキュメントページ(Docs)に、作成者のアイコンを表示する
    • Docsの一覧ページ(index)には、作成者のアイコンと最終更新日を表示したい
    • 詳細ページ(show)にも作成者のアイコンを表示したい

Webフレームワークは Rails を採用している。

苦戦した点

NilClassエラーの解決に手こずった

ドキュメントを保存する pages テーブルと、users テーブルを紐付ける必要があった(アソシエーション)。というのも、pages テーブルにはuser_idを保存するカラムがなかった。そのためユーザーのアイコンを取得することができなかった。

アソシエーションを設定したはいいものの、コントローラーやビューを修正してアイコンを表示しようとしたら、NoMethodError がでてしまった。アイコンを表示するためのメソッドであるavatar_urlが、undefined になっていた。

undefined method `avatar_url` for nil:NilClass

エラーが出ていた箇所

= image_tag page.user.avatar_url ~

pageという Page モデルインスタンスuser_idnilになっていたために出たエラーだった。

結果的に、このエラー解決にもっとも時間をかけてしまった…。

苦戦した理由

  • エラーの対処法(デバッグ)がわかっていなかった
  • nil:NilClassエラーが出る意味をよくわかっていなかった

これに尽きる。

どうやって問題を解決したのか?

デバッグの基本を学ぶには、以下の記事がとても参考になった。

プログラミング初心者歓迎!「エラーが出ました。どうすればいいですか?」から卒業するための基本と極意(解説動画付き) - Qiita

printデバッグにさようなら!Ruby初心者のためのByebugチュートリアル - Qiita

感謝です🙏

学び

デバッグの大切さ

今までは、エラー画面の赤い文字を見て「うげ・・・」となっていた。

しかし、今回デバッグの基礎を学んだことにより、「お、なんかエラー出たな。原因はなんだろ?」と素直に思えるようになった。恐怖心がすこし減った。

DBに変更がある場合は別 Issue に切り出して先にやる場合がある

今回、pages テーブルにuser_idが入っていないとエラーで画面が表示されないのが明らかだった。こんな場合は、先にマイグレーションとデータ挿入をするため、別Issueに切り分けておこなう。

本番のデータ変更をどうやって行うか

単発の rake タスクに書く。

RailsでDBのデータ変更はどこにかく?〜真相編〜 - komagataのブログ