Rails Ist Ein Fehler Aufgetreten Beim Parsen Params
Ich arbeite auf einer einfachen Umfrage-app, wo der Benutzer kann die Teilnahme an der Umfrage in meiner Android-app und dann nach der Wahl zurück in meine rails-server. An einer Stelle war es, die Buchung der Entscheidungen, die Ordnung auf dem server, aber es ist vor kurzem ab auslösen eines Fehlers während dem Parsen params und nicht mehr die Schaffung des Benutzers Wahl.
Ich bin relativ neu auf HTTP und haben Schwierigkeiten mit der Behebung dieses Fehlers. Jede Hilfe ist sehr willkommen!
Wenn ich diese curl Anfrage:
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
Ich am Ende mit diesem Fehler in den 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'
Da war es auch funktioniert, bevor ich wundere mich, wenn es hat zu tun mit etwas, was in meinen controller? Die einzige änderung die ich gemacht hatte, war das ändern Benutzer Appuser obwohl sich an den tatsächlichen Daten Modell appusers wird den Leuten unter den Umfragen:
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
Irgendwelche Ideen? Ich habe überprüft, dass die JSON-gültig auf jsonlint.com (aber es ist die gleiche Anfrage gesendet vor).
- afaik, sind die Parameter werden sollte, eine Abfrage-wie string:
-d"question_id=1&answer_id=2"
- Was, wenn Sie einzelne zitieren json? '{"question_id":"1","answer_id":"2"}'
Du musst angemeldet sein, um einen Kommentar abzugeben.
Da haben Sie:
params.require(:choice).permit(:appuser_id, :answer_id, :question_id)
choice
ist erforderlich und Sie sollten, indem Sie Ihre JSON-so: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
Parameter übergeben werden müssen innerhalb von Anführungszeichen(")
oder