So I got up early and got cracking on some code and then I hit an absolute wall – the kind of thing that just stops you cold. I was debugging a controller in my side project and I got a nil on accessing a member on the params hash. And since this was something I’d done previously I thought it odd but added debugger to my controller and evaluated params:

[12, 21] in /Users/sjohnson/Dropbox/fuzzygroup/hyde/seira_watch_web_app/app/controllers/instructors_controller.rb
   12:   end
   13:
   14:   def create
   15:     @instructor = Instructor.new# => (params[:instructor])
   16:     debugger
=> 17:     if params[:instructor][:url] =~ /http/
   18:     else
   19:       flash[:error] = "Please specify a valid url"
   20:       redirect_to edit_instructor_path(@instructor) and return
   21:     end
(byebug) params
nil

A decade plus in Rails and Ghu only knows how many controllers and I don’t think I’ve ever seen nil for params. I mean params is effectively a god object that is always there. How the hell does it become nil?

This was when I put my keyboard down, went over to my editor and started doing some writing. I knew in my gut that this was an oddball issue and what I really needed was another set of eyes. And, an hour later, my buddy Nick, gave me a hand over Google Hangouts pointing out that I had something wrong my strong params method:

def instructor_params
  params.require[:instructor].permit(:url)
end

The above code is lexically correct and won’t cause any errors but it will absolutely screw everything up and make params goto nil. This should have been:

def instructor_params
  params.require(:instructor).permit(:url)
end

The difference between [ ] and () is of course very, very real but it is subtle, particularly from a visual angle where you can easily mistake them.