Rails Idiocy - When Params In Your Controller Are Nil
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.
Posted In: #rails