Rails An Error Occured While Parsing Params
Solution 1
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
Solution 2
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"}'
Related videos on Youtube
Tom Hammond
Updated on July 09, 2022Comments
-
Tom Hammond almost 2 years
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).
-
Slicedpan over 10 yearsthe rocket should be a colon
-
Tom Hammond over 10 yearsIt was actually a combination of both things, but now it works!
-
Tom Hammond over 10 yearsThat'll do it as well as the above issue with choice not being in the JSON
-
Anna Billstrom over 9 yearsYou have to put single-ticks surrounding the JSON string in the command above.