今回は業務でRuby on Railsを用いたコーディングをするにあたって行き当たったエラーに関するメモを共有します。
初心者がこんなところでつまずいたよ、という記録を残していきたいと思いますので、近い境遇の方の助けになれば幸いです。
筆者のステータス
Ruby on Railsの初心者(学習中)
JavaやPerl等についてはいくらか経験あり
実現したかったこと
次のような構造の"data"から、配列"hogeDetails"に含まれる"hoge_id"を取得したいと考えました。
data ----- id
|--- hogeDetails<Array>
|--- hoge_id
|--- hoge_name
...
今回行き当たったエラー
上記の目的を実現するために、「data以下の要素を順に指定していけばよい」と考え、次のような実装を行いました。
hogeId = data.hogeDetails.hoge_id
ところが次のようなエラーが発生し、想定したように値が取れていません。
エラーメッセージの内容は、どうやら「指定したメソッドは未定義ですよ」といったもののようでした。
undefined method `hoge_id' for [#<hogeDetails id: 1, hoge_id: 123456, ......]:Array
hogeDetailsの配下にはhoge_idが間違いなく存在しているのになぜだろう、というのが今回詰まったポイントです。
エラーの原因と解決策
このエラーの原因をひとことで言い表すと、「hoge_idを取得するための指定方法が間違っていた」ということになります。修正後の実装は次の通りです。
hogeId = data.hogeDetails[index].hoge_id
修正前の実装と比較すると、hogeDetailsに対してインデックスの指定をしていることがわかります。今回は「配列に対して要素位置を指定していなかったため発生したエラー」でした。例えるなら荷物の送り状を作成するときに、宛先の建物名までは書いたものの部屋番号が抜けていたようなイメージでしょうか。
dataの構造も、より実際に即して表すと次のようになります。
data ----- id
|--- hogeDetails<Array>
|--- hogeDetails[0] ★配列hogeDetailsの要素のうち、どれを取得したいか指定する必要がある
|--- hoge_id
|--- hoge_name
...
|--- hogeDetails[1]
|--- hoge_id
|--- hoge_name
...
分かってしまえば単純というか、非常に初歩的なミスだったと言えます。
気づいたこと・補足
自分以外の担当者が作成したソースコードに手を加える形で修正を行い、今回取り上げたエラーに遭遇しました。データの構造も設計書やログ等で確認しながらの作業だったため、理解が不十分だったところもありました。
特に初めて触れるソースコードや不慣れな言語の場合はちょっとしたミスでも解決までに時間を要することがあり、改めて日々の学習の大切さを実感しました。
今後の記事でも、学習の中で得たちょっとした気づきを共有していければと思います。