2016-06-03 9 views
0

Я наблюдаем странное поведение в Rails, при отправке запроса на запись со следующим телом: enter image description hereКак правильно отправить запрос на проверку JSON Rails?

Если вы отметите это Hash (преобразуется в формат JSON при отправке). Но как ни странно, когда читается Params в контроллере, распознается как это:

enter image description here

Если вам тщательно проверить, атрибуты :first_name и :email перемещаются к предыдущему элементу в массиве.

Я думал, что если у вас есть массив с определенными атрибутами для первого элемента, но некоторые разные атрибуты для следующих элементов, массив будет соблюдать позиции, для которых установлены атрибуты.

Я знаю, что, скорее всего, ответ будет «просто поставить nil или пустое значение этих атрибутов на первый элемент массива», но я больше заинтересован в причине того, почему это происходит.

спасибо.

UPDATE

Благодаря вопрос, я реплицируюсь сценарий сформировать браузер (я изначально делал запрос от test функции рельсов), и проверкой сети из браузера, это то, что посылается :

{ 
    "name": "un nombre", 
    "team_members": [ 
    { 
     "user_id": 1, 
     "team_member_role_id": 4 
    }, 
    { 
     "email": "[email protected]", 
     "first_name": "Cap America", 
     "team_member_role_id": 4, 
     "admin": true 
    }, 
    { 
     "email": "[email protected]", 
     "first_name": "Bruce Banner", 
     "team_member_role_id": 1, 
     "admin": false 
    }, 
    { 
     "email": "[email protected]", 
     "first_name": "Tony Stark", 
     "team_member_role_id": 1, 
     "admin": false 
    }, 
    { 
     "email": "[email protected]", 
     "first_name": "Thor Hijo de Odín", 
     "team_member_role_id": 2, 
     "admin": false 
    } 
    ] 
} 

И это работает. Поэтому я сосредоточился на том, как я отправлял информацию из тестовой среды, это фактический код:

team  = { 
    :name   => 'un nombre', 
    :team_members => [ 
     { 
      :user_id    => 1, 
      :team_member_role_id => TeamMemberRole.role_communicator_id 
     }, 
     { 
      :email    => '[email protected]', 
      :first_name   => 'Cap America', 
      :team_member_role_id => TeamMemberRole.role_communicator_id, 
      :admin    => true 
     }, 
     { 
      :email    => '[email protected]', 
      :first_name   => 'Bruce Banner', 
      :team_member_role_id => TeamMemberRole.role_visionary_id, 
      :admin    => false 
     }, 
     { 
      :email    => '[email protected]', 
      :first_name   => 'Tony Stark', 
      :team_member_role_id => TeamMemberRole.role_visionary_id, 
      :admin    => false 
     }, 
     { 
      :email    => '[email protected]', 
      :first_name   => 'Thor Hijo de Odín', 
      :team_member_role_id => TeamMemberRole.role_developer_id, 
      :admin    => false 
     } 
    ] 
} 
post create_team_path, :team => team, :format => :json 

А что читается в контроллере по request.raw, это то, что получает (с помощью отладчика):

team[name]=un+nombre& 
team[team_members][][user_id]=1& 
team[team_members][][team_member_role_id]=4& 
team[team_members][][email]=cpamerica%40avengers.com& 
team[team_members][][first_name]=Cap+America& 
team[team_members][][team_member_role_id]=4& 
team[team_members][][admin]=true& 
team[team_members][][email]=hulk%40avenrgers.com& 
team[team_members][][first_name]=Bruce+Banner& 
team[team_members][][team_member_role_id]=1& 
team[team_members][][admin]=false& 
team[team_members][][email]=ironman%40avengers.com& 
team[team_members][][first_name]=Tony+Stark& 
team[team_members][][team_member_role_id]=1& 
team[team_members][][admin]=false& 
team[team_members][][email]=thor%40avengers.com& 
team[team_members][][first_name]=Thor+Hijo+de+Od%C3%ADn& 
team[team_members][][team_member_role_id]=2& 
team[team_members][][admin]=false& 
format=json 

Любая идея о том, почему индекс каждого team_member отсутствует? Я посылаю массив неправильно?

+0

вы проверили, что на самом деле отправляется на проводе (например, сеть инспектор использовать Хрома)? –

+0

@FrederickCheung Я делаю запрос, используя тестовую среду Rails, а не браузер. Поэтому я написал 'post create_team_path, {: format =>: json,: team => team}' где 'команда' - это хэш. – unmultimedio

+0

@FrederickПодробнее об обновлении нового подхода к вопросу – unmultimedio

ответ

1

Чтобы отправить запрос приемлемый JSon вам необходимо отправить в качестве сформированной строки вместо хэша, добавить заголовки ваш код должен выглядеть примерно так:

post create_team_path, {:team => team}.to_json, 'CONTENT_TYPE' => 'application/json;charset=utf-8' 

Примечание проблема в парсера хэш формировать-запрос, не добавляя индекс каждого объекта

Источник: How to post JSON data in rails 3 functional test