How to fix TypeError: Nil is not a Symbol or String

If you’re using the form helpers built into Rails (or a library like SimpleForm that’s built on top of them), you might run into a somewhat confusing error:

TypeError: nil is not a symbol nor a string

Usually this will originate from somewhere like value_for_collection which is part of the FormOptionsHelper in ActionView, but grepping the source won’t yield any results for the error string. You might be experiencing this in your own application you’re using a tiny dose of metaprogramming.

That’s because TypeError comes from Ruby. The actual call raising this error is __send__, which is happening in the Ruby internals after a call to send. In the FormOptionsHelper example case above, value is nil, and Rails tries to call item.send(nil) which won’t work.

If you’re encountering this in your own code this should be easy enough to fix: add a nil guard to ensure the value you’re passing to send is non-nil. If you’re using, say, a grouped_select in SimpleForm, the fix is a little less direct: add a value_method parameter to your call to input:

<%= f.input :flavors, 
            collection: @grouped_flavors,
            as: :grouped_select,
            group_method: :first,
            label_method: :flavor_name,
            value_method: :id %>

This is because SimpleForm isn’t defensive about input, which is fine if you’re developing an application, but less so if you’re developing a library for others to use where a helpful error message can save dozens of people time and confusion. Lesson learned!

 
49
Kudos
 
49
Kudos

Now read this

Typo Forgiveness in Git & Bash

I’m often moving pretty quickly when it comes time to commit work to Git. I have a bit of a workflow down, and I type the same few shortcuts frequently: $ git st (expands to status) $ git ks (expands to difftool, which opens... Continue →