Rails An Error Occured While Parsing Params

23,846

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"}'
Share:
23,846

Related videos on Youtube

Tom Hammond
Author by

Tom Hammond

Updated on July 09, 2022

Comments

  • Tom Hammond
    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
    Slicedpan over 10 years
    the rocket should be a colon
  • Tom Hammond
    Tom Hammond over 10 years
    It was actually a combination of both things, but now it works!
  • Tom Hammond
    Tom Hammond over 10 years
    That'll do it as well as the above issue with choice not being in the JSON
  • Anna Billstrom
    Anna Billstrom over 9 years
    You have to put single-ticks surrounding the JSON string in the command above.