JSON-запрос Rails неправильно анализируется в параметрах записи - PullRequest
16 голосов
/ 14 декабря 2011

Я пытаюсь отладить проблему, когда Rails не декодирует данные JSON POST.

Журналы сервера показывают:

2011-12-14T06:44:44+00:00 app[web.2]: Started POST 
2011-12-14T06:44:44+00:00 app[web.2]:   Processing by PostsController#create as */*
2011-12-14T06:44:44+00:00 app[web.2]:   Parameters: {"{\"athlete_id\":\"\",\"known_as\":\"abc\",\"email\":\"abc@defg.com\",\"result\":\"112233\",\"rx\":false,\"mods\":\"thkjth\",\"notes\":\"\"}"=>nil, "affiliate_id"=>"testaffiliate", "wod_id"=>"12345"}

Обратите внимание, что строка JSON неparsed - Rails назначает его в качестве ключа в хэше, указывая на нулевое значение.У кого-нибудь есть идеи, прежде чем я напишу before_filter, который пытается JSON.parse всех ключей params?

Я не думаю, что это уместно, так как я отправляю и получаю данные в порядке, но эта проблема возникаетво время запроса CORS от IE (с использованием XDomainRequest).

Ответы [ 2 ]

17 голосов
/ 12 января 2012

Вы можете обойти это, установив заголовок Content-Type на «application / json». Вы можете сообщить контроллеру, что он ожидает вернуть с заголовком Accept, установленным в «application / json».

Следующая команда с обоими заголовками:

curl -d '{ "company": { "name": "acme", "address": "123 Carrot Street" } }' http://0.0.0.0:3000/mysite --header "Accept: application/json" --header "Content-Type: application/json"

Создает это в логах:

Started POST "/mysite" for 127.0.0.1 at 2012-01-11 16:09:48 -0800
  Processing by MyController#create as JSON
  Parameters: {"company"=>{"name"=>"acme", "address"=>"123 Carrot Street"}, "wassup"=>{"company"=>{"name"=>"acme", "address"=>"123 Carrot Street"}, "controller"=>"wassup", "action"=>"create"}}
Completed 200 OK in 5ms (Views: 2.0ms | ActiveRecord: 0.0ms)

Эта команда с заголовком Accept:

curl -d '{ "company": { "name": "acme", "address": "123 Carrot Street" } }' http://0.0.0.0:3000/mysite --header "Accept: application/json"

Создает эти журналы:

Started POST "/mysite" for 127.0.0.1 at 2012-01-11 16:07:26 -0800
  Processing by MyController#create as JSON
  Parameters: {"{ \"company\": { \"name\": \"acme\", \"address\": \"123 Carrot Street\" } }"=>nil}
Completed 200 OK in 7ms (Views: 5.0ms | ActiveRecord: 0.0ms)

И, наконец, эта команда с заголовком Content-Type:

curl -d '{ "company": { "name": "acme", "address": "123 Carrot Street" } }' http://0.0.0.0:3000/mysite --header "Content-Type: application/json"

Создает эти журналы:

Started POST "/mysite" for 127.0.0.1 at 2012-01-11 16:08:11 -0800
  Processing by MyController#create as */*
  Parameters: {"company"=>{"name"=>"acme", "address"=>"123 Carrot Street"}, "wassup"=>{"company"=>{"name"=>"acme", "address"=>"123 Carrot Street"}, "controller"=>"wassup", "action"=>"create"}}
Completed 200 OK in 4ms (Views: 2.0ms | ActiveRecord: 0.0ms)

Обратите внимание, что анализируемые параметры и сообщение об обработке изменяются незаметно для каждого типа заголовка.

9 голосов
/ 03 ноября 2012
before_filter :fix_ie_params, only: [:create, :update]

Для Тонкий :

def fix_ie_params
  if request.format == '*/*'
    # try to JSON decode in case of IE XDR
    begin

      params.merge! ActiveSupport::JSON.decode(request.body.string)

    rescue Exception=>e
      # todo: log exception
    end
  end
end

Для Единорог и Phusion Passenger :

def fix_ie_params
  if request.format == '*/*'
    # try to JSON decode in case of IE XDR
    begin

      request.body.rewind
      params.merge! ActiveSupport::JSON.decode(request.body.read)

    rescue Exception=>e
      # todo: log exception
    end
  end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...