そのオブジェクトに無いメソッドを呼んだときのエラーです。nilに対する呼び出しが特に多いです。
total = nil
[1, 2, 3].each { |n| total = total + n }
puts total
total = 0
[1, 2, 3].each { |n| total = total + n }
puts total # 6
▶ 修正済みコードを実行エディタで開く
「undefined method for nil」は、変数がnilなのにメソッドを呼んでいるサインです。合計変数はtotal = 0で初期化します。&.(ぼっち演算子)を使えばnilのとき呼び出しをスキップできます。
undefined method `foo' for nil:NilClass のfor のうしろがレシーバ(呼び出された相手)の型です。for nil:NilClass なら相手がnil、for an instance of String(Ruby 3.4以降)や for "abc":String(3.3以前)なら相手が文字列、という意味です。まず「どの変数が」その型になっているかを特定します。
user = nil
puts user.name
# undefined method `name' for nil ← user が nil
x = 0 や x = [] で初期化、hash.fetch(:key, 既定値)、x&.method で回避。"5".to_i + 1 のように変換。gets の戻り値は文字列なので gets.to_i。123.to_s で文字列化してから。lenght→length)、または対象がネストしていて1階層ずれている。undefined local variable or method `x' はNameErrorで、名前そのものが存在しません(スペルミスや未定義)。undefined method `x' for ... のNoMethodErrorは、相手のオブジェクトは存在するがそのメソッドを持っていない状態です。エラークラス名で切り分けます。
# NameError(変数が無い)
puts total
# NoMethodError(相手はいるがメソッドが無い)
puts 5.push(3)
private method `foo' called for an instance of Bar は、privateメソッドを obj.foo の形(レシーバ付き)で呼んだときに出ます。private メソッドはレシーバを付けずに foo と呼ぶか、send(:foo) を使います。
val = data&.dig(:user, :name) # 途中がnilでも安全
puts val || "名前なし"
obj = "text"
puts obj.upcase if obj.respond_to?(:upcase)
▶ &.(ぼっち演算子)とrespond_to?を実行エディタで開く