2015-07-20 4 views
0

Я думал, что это будет просто, поскольку я постоянно использую AJAX для обновления моделей через реальную форму, существующую в DOM, но при попытке отправить объект JSON я сталкиваюсь с проблемами пытаясь заставить его работать.Отправка объекта JSON с помощью запроса AJAX POST для контроллера Rails

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

JS

var form_data = JSON.stringify(quote); 

$.ajax({ 
    url: '/quotes/save_draft', 
    data: { params: form_data }, 
    type: 'POST', 
    contentType: 'application/json', 
    cache: false, 
    success: function(data) { 

    }, 
    error: function() { 

    } 
}); 

Для атрибута data я попытался

data: { params: form_data }, 
data: form_data, 
data: quote, 

Рельсы Контроллер

RAILS_DEFAULT_LOGGER.info params.inspect 
RAILS_DEFAULT_LOGGER.info params[:_json].inspect 

, но я до сих пор не могу получить р Родственность исходного объекта JSON для успешной печати, например. RAILS_DEFAULT_LOGGER.info params[:_json][:params][:payment_term], причем [:params] является атрибутом верхнего уровня объекта JSON.

Результат RAILS_DEFAULT_LOGGER.info params[:_json][:params][:payment_term] выглядит как строка с кодировкой url, а не объект JSON, но если я попытаюсь использовать JSON.parse(params[:_json]), я просто получаю сообщение об ошибке TypeError (can't convert String into Integer).

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

Полный контроллер

def save_draft 
    if request.post? 
    RAILS_DEFAULT_LOGGER.info "\n\n" 
    RAILS_DEFAULT_LOGGER.info params 
    RAILS_DEFAULT_LOGGER.info params[:_json] 
    RAILS_DEFAULT_LOGGER.info params[:_json][:form_data] 
    RAILS_DEFAULT_LOGGER.info params[:_json][:form_data][:payment_term] 
    RAILS_DEFAULT_LOGGER.info "\n\n" 

    render :text => '1' 
    else 
    render :text => '0' 
    end 
end 

Ошибка тока от что делать с RAILS_DEFAULT_LOGGER.info params[:_json][:form_data] линии, это ошибка не метод из-за нулевой объект.

Это выход RAILS_DEFAULT_LOGGER.info params.inspect

{"action"=>"save_draft", "_json"=>"form_data=%7B%22line_items%22%3A%5B%7B%22contract_term%22%3A12%2C%22product%22%3A%222-Pair+EFM+off-net%22%2C%22site%22%3Anull%2C%22quantity%22%3A1%2C%22setup_cost_each%22%3A1500%2C%22setup_cost%22%3A1500%2C%22rental_cost_each%22%3A240%2C%22rental_cost%22%3A240%2C%22is_ad_hoc%22%3Afalse%2C%22default_setup%22%3A1500%2C%22default_rental%22%3A240%2C%22default_contract%22%3A12%2C%22fixed_initial_cost%22%3Afalse%2C%22price_list_item_id%22%3A194%2C%22info%22%3A%22Provides+up+to+10Mb%2Fs+of+symmetric+Ethernet+connectivity+with+a+6-hour+fix+SLA.%22%7D%5D%2C%22partner_id%22%3A125%2C%22raised_by%22%3A940%2C%22approval_required%22%3A0%2C%22payment_term%22%3A%22Monthly%22%2C%22message%22%3A%22%22%2C%22scope_of_work%22%3A%22%22%2C%22internal_message%22%3A%22%22%2C%22partner_ref%22%3A%22%22%2C%22ccs%22%3A%22%22%2C%22project_requires_coordination%22%3A0%7D", "controller"=>"quotes"} 
+0

Просто используйте простой 'данные: {form_data: form_data}'. Можете ли вы отправить свой контроллер? –

+0

Это просто догадка, но попробуйте: измените 'contentType: 'application/json'' на' contentType: "application/json; charset = utf-8", dataType: "json",' – Athar

+0

Спасибо за предложения , Я реализовал оба, контроллер довольно прост, я обновил вопрос. – martincarlin87

ответ

2

попробовать это

$.ajax({ 
    url: '/quotes/save_draft', 
    data: quote, 
    type: 'POST', 
    cache: false, 
    success: function(data) { 
     #your call 
    }, 
    error: function() { 
     #show error 
    } 
}); 

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

  • Нет связанных вопросов^_^