I'm working on a basic survey app, where the user can take the survey in my Android app and then post the choices back to my rails server. At one point it was posting the choices fine to the server but it's recently starting throwing an error while parsing params and no longer creating the user's choices.
I'm relatively new to HTTP and have been struggling with troubleshooting this error. Any help is much appreciated!
If I do this curl request:
curl -v -H 'Content-Type: application/json' -H 'Accept: application/json' -X POST -d {"question_id":"1","answer_id":"2"} http://ec2-54-186-132-102.us-west-2.compute.amazonaws.com:8080/questions/1/choices
I end up with this error in the stacktrace:
Started POST "/questions/1/choices" for 172.31.10.156 at 2014-03-19 11:15:02 +0000
Error occurred while parsing request parameters.
Contents:
ActionDispatch::ParamsParser::ParseError (795: unexpected token at 'question_id:1'):
actionpack (4.0.0) lib/action_dispatch/middleware/params_parser.rb:53:in `rescue in parse_formatted_parameters'
actionpack (4.0.0) lib/action_dispatch/middleware/params_parser.rb:32:in `parse_formatted_parameters'
actionpack (4.0.0) lib/action_dispatch/middleware/params_parser.rb:23:in `call'
actionpack (4.0.0) lib/action_dispatch/middleware/flash.rb:241:in `call'
rack (1.5.2) lib/rack/session/abstract/id.rb:225:in `context'
rack (1.5.2) lib/rack/session/abstract/id.rb:220:in `call'
actionpack (4.0.0) lib/action_dispatch/middleware/cookies.rb:486:in `call'
activerecord (4.0.0) lib/active_record/query_cache.rb:36:in `call'
activerecord (4.0.0) lib/active_record/connection_adapters/abstract/connection_pool.rb:626:in `call'
activerecord (4.0.0) lib/active_record/migration.rb:369:in `call'
actionpack (4.0.0) lib/action_dispatch/middleware/callbacks.rb:29:in `block in call'
activesupport (4.0.0) lib/active_support/callbacks.rb:373:in `_run__516066872829663058__call__callbacks'
activesupport (4.0.0) lib/active_support/callbacks.rb:80:in `run_callbacks'
actionpack (4.0.0) lib/action_dispatch/middleware/callbacks.rb:27:in `call'
actionpack (4.0.0) lib/action_dispatch/middleware/reloader.rb:64:in `call'
actionpack (4.0.0) lib/action_dispatch/middleware/remote_ip.rb:76:in `call'
actionpack (4.0.0) lib/action_dispatch/middleware/debug_exceptions.rb:17:in `call'
actionpack (4.0.0) lib/action_dispatch/middleware/show_exceptions.rb:30:in `call'
railties (4.0.0) lib/rails/rack/logger.rb:38:in `call_app'
railties (4.0.0) lib/rails/rack/logger.rb:21:in `block in call'
activesupport (4.0.0) lib/active_support/tagged_logging.rb:67:in `block in tagged'
activesupport (4.0.0) lib/active_support/tagged_logging.rb:25:in `tagged'
activesupport (4.0.0) lib/active_support/tagged_logging.rb:67:in `tagged'
railties (4.0.0) lib/rails/rack/logger.rb:21:in `call'
actionpack (4.0.0) lib/action_dispatch/middleware/request_id.rb:21:in `call'
rack (1.5.2) lib/rack/methodoverride.rb:21:in `call'
rack (1.5.2) lib/rack/runtime.rb:17:in `call'
activesupport (4.0.0) lib/active_support/cache/strategy/local_cache.rb:83:in `call'
rack (1.5.2) lib/rack/lock.rb:17:in `call'
actionpack (4.0.0) lib/action_dispatch/middleware/static.rb:64:in `call'
railties (4.0.0) lib/rails/engine.rb:511:in `call'
railties (4.0.0) lib/rails/application.rb:97:in `call'
rack (1.5.2) lib/rack/lock.rb:17:in `call'
rack (1.5.2) lib/rack/content_length.rb:14:in `call'
rack (1.5.2) lib/rack/handler/webrick.rb:60:in `service'
Since it was working before I'm wondering if it has to do with something in my controller? The only change I made was changing User to Appuser though to reflect the actual data model of appusers being the folks taking the surveys:
class ChoicesController < ApplicationController
before_action :set_choice, only: [:show, :edit, :update, :destroy]
skip_before_action :verify_authenticity_token
def index
@question = Question.find(params[:question_id])
end
# POST /choices
# POST /choices.json
def create
@question = Question.find(params[:question_id])
@choice = @question.choices.build(choice_params)
@choice.answer = Answer.find(params[:choice][:answer_id])
@appuser = Appuser.find_user_by_token params[:choice][:user_auth_token]
@appuser.choices << @choice
@survey = Survey.find(params[:choice][:survey_id])
@survey.appusers.push(appuser)
respond_to do |format|
if @choice.save
format.html { redirect_to question_choices_path, notice: 'Choice was successfully created.' }
format.json { redirect_to question_choices_path, status: :created, location: @choice }
else
format.html { render action: 'new' }
format.json { render json: @choice.errors, status: :unprocessable_entity }
end
end
end
# DELETE /choices/1
# DELETE /choices/1.json
def destroy
@choice.destroy
respond_to do |format|
format.html { redirect_to choices_url }
format.json { head :no_content }
end
end
private
# Use callbacks to share common setup or constraints between actions.
def set_choice
@choice = Choice.find(params[:id])
end
def set_question
@question = Question.find(params[:choice][:question_id])
end
# Never trust parameters from the scary internet, only allow the white list through.
def choice_params
params.require(:choice).permit(:appuser_id, :answer_id, :question_id)
end
end
Any ideas? I verified that the JSON is valid at jsonlint.com (but it is the same request that was being sent before).
Since you have:
params.require(:choice).permit(:appuser_id, :answer_id, :question_id)
choice
is required and you should be passing your JSON like this:
curl -v -H 'Content-Type: application/json' -H 'Accept: application/json' -X POST -d '{"choice": {"question_id":"1", "answer_id":"2"}}' http://ec2-54-186-132-102.us-west-2.compute.amazonaws.com:8080/questions/1/choices
The parameters need to be passed within quotes('')
curl -v -H 'Content-Type: application/json' -H 'Accept: application/json' -X POST -d '{"question_id":"1","answer_id":"2"}' http://ec2-54-186-132-102.us-west-2.compute.amazonaws.com:8080/questions/1/choices
or
curl -XPOST -H "Content-Type: application/json" http://ec2-54-186-132-102.us-west-2.compute.amazonaws.com:8080/questions/1/choices -d '{"question_id":"1","answer_id":"2"}'
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With