Here’s my flow for debugging a misbehaving controller. Imagine that there’s a form at
app/views/messages/new.html.erb that is posting to
MessagesController#create. The parameters aren’t being passed through from the form to the controller, and the model is raising a validation error saying that a field is blank – even though it’s clearly not.
Step 0: Does restarting the server fix the problem?
Step 1: Check the form
- Is the attribute defined in the correct place?
- Is it using the form builder helper (i.e.
f.text_field) or is it using
text_field_tag? If it’s supposed to be
params[:message][:body]then it should be using the form builder. If not, then it should be using
- Unlikely, but still possible: Is the field disabled before submission of the form? Disabled fields are not passed through as parameters.
Step 2: Check the controller
- Is the route to the controller defined correctly in
- Is the controller set up to receive the right parameters?
- Did I spell ‘message’ with the correct number of ‘s’s within
- Are the parameters from the form permitted using strong_parameters?
- Are all the parameters from the form permitted?
- Did I spell the parameters correctly?
- What does the log output say for this controller? Does it contain the parameters I want with the values I want?
- Can I place a
binding.prystatement at the top of the action and print out
paramsto see the correct parameters there too?
Step 3: Check the model
- If using
attr_accessible, are the attribute marked as accessible?
- Did I accidentally use
attr_accessorwhen I meant to use
- Did I define a setter method for this attribute accidentally that doesn’t actually set the attribute?
- Is there a callback that unsets this parameter somehow?
- If it’s nested attributes that are being sent through, go check the nested model for the above.