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

A few terminal shortcuts for Rails devs

Here are a few command-line shortcuts for anybody that uses Ruby or Ruby on Rails on a daily basis: Abbreviate bundle exec [command] # Replace bundle exec with just be and you no longer have an excuse for running a rake without the... Continue →