web-dev-qa-db-ja.com

Railsパラメータの解析中にエラーが発生しました

私は基本的な調査アプリに取り組んでいます。ユーザーは私のAndroidアプリで調査を行い、選択内容を私のRailsサーバーに投稿できます。ある時点では、サーバーに適切な選択肢を投稿していましたが、最近、パラメーターの解析中にエラーをスローし始め、ユーザーの選択肢を作成しなくなりました。

私はHTTPに比較的慣れておらず、このエラーのトラブルシューティングに苦労しています。どんな助けでも大歓迎です!

このカールリクエストを行う場合:

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

スタックトレースでこのエラーが発生します。

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'

それが私のコントローラーの何かと関係があるのだろうかと思う前にそれが働いていたので?私が行った唯一の変更は、ユーザーをAppuserに変更することでしたが、調査を行った人々であるAppuserの実際のデータモデルを反映しています。

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

何か案は? JSONがjsonlint.comで有効であることを確認しました(ただし、以前に送信されたものと同じリクエストです)。

10
Tom Hammond

あなたが持っているので:

params.require(:choice).permit(:appuser_id, :answer_id, :question_id)

choiceが必要であり、次のようにJSONを渡す必要があります。

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

8
tirdadc

パラメータは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

または

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"}'
7
Egalitarian