2014-10-30 5 views
0

Я посылаю POST с JQuery, как этотРубин JSON.parse дает неожиданный маркер ошибки

var authorisationType = "payment"; 

    var paymentData = { 
     cardholdername: $("#userCardName").val(), 
     cardnumber: $("#userCardNumber").val(), 
     expmonth: $("#userExpMonth").val(), 
     expyear: $("#userExpYear").val(), 
     cvv:$("#userCVV").val(), 
     amount: "$15.00" 
    } 

    var postData = new Object(); 
    postData.username = username; 
    postData.type = authorisationType; 
    postData.data = paymentData; 

    var authorisationType = "payment"; 

    console.log("sending username and token to server"); 
    $.ajax({ 
     type: 'POST', 
     url: url, 
     data: JSON.stringify(postData), 
     contentType: "application/json; charset=utf-8", 
     dataType: "json", 
     success: successHandler, 
     error: errorHandler 
    }); 

на мой контроллер Rails:

def authorisation_request 
    puts "preparse" 
    hash = JSON.parse(params[:username]) 
    puts "hash" 
    puts "username:" + JSON.parse(params[:username]).to_s + " type:" + JSON.parse(params[:type]).to_s + " data:" + JSON.parse(params[:data]).to_s 
end 

И я получаю следующее сообщение об ошибке в консоли:

Parameters: {"username"=>"[email protected]", "type"=>"payment", "data"=>{"cardholdername"=>"me myself", "cardnumber"=>"xxxxxxxxxxxx3456", "expmonth"=>"01", "expyear"=>"2015", "cvv"=>"999", " 
amount"=>"$15.00"}, "session"=>{"username"=>"[email protected]", "type"=>"payment", "data"=>{"car 
dholdername"=>"me myself", "cardnumber"=>"xxxxxxxxxxxx3456", "expmonth"=>"01", "expyear"=>"2015" 
, "cvv"=>"999", "amount"=>"$15.00"}}} 

preparse 
Completed 500 Internal Server Error in 4ms 

JSON::ParserError (757: unexpected token at '[email protected]'): 
    app/controllers/sessions_controller.rb:119:in `authorisation_request' 

Что я делаю неправильно?

ответ

4

params[:username] содержит строку ([email protected]), которая не является действительной JSON. Вам не нужно называть JSON.parse.

3

Было бы гораздо чище и проще для вас, если вы размещаете данные с JQuery, как это:

var postData = new Object(); 
postData.userdata = { 'username': username, 
         'type': authorisationType, 
         'data': paymentData }; 

Теперь в контроллере, вы можете:

def authorisation_request 
    puts params[:userdata] 
end 

Нет необходимости JSON.parse поскольку все значения доступны в параметре в виде пары ключ-значение, используя params.

+0

+1 потому что, хотя он не отвечает на вопрос напрямую, он дает отличный совет по лучшим практикам и делает вопрос неуместным. Теперь параметры можно получить, например: params [: userdata] [: username] и т. Д. Благодаря! – Mike

Смежные вопросы