IMO the root issue is the language syntax allows you to write `foo.bar = 123` instead of `foo.bar= 123` which kind of obscures the fact that `bar=` is a method.
If you've never written Ruby I 100% agree that the NoMethodError is perhaps confusing. However as others have noted this is just a really simple core concept you learn right away! This is your standard "oops, I called something that doesn't exist" message and contains everything you need to see where you went wrong.
99% of the time that message is all you need; for the other 1% you can use a debugger to pause things and see e.g. what methods `foo` does support.
To be honest I did understand what was wrong from the error message on first read, despite not knowing ruby (but probably aided by experience in other languages with similar patterns). I think what the distant grandparent was noticing is valid though: the error message is accurately but tangential to the reason for the error. Sure, you can figure it out. Probably you can figure it out without needing to be a great master of the language. But to criticize somebody for wondering whether an error message could be more informative/relevant, when that is clearly possible, I find galling.
What matters isn't "is" but "can act like".