Я думал, что это будет просто, поскольку я постоянно использую 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"}
Просто используйте простой 'данные: {form_data: form_data}'. Можете ли вы отправить свой контроллер? –
Это просто догадка, но попробуйте: измените 'contentType: 'application/json'' на' contentType: "application/json; charset = utf-8", dataType: "json",' – Athar
Спасибо за предложения , Я реализовал оба, контроллер довольно прост, я обновил вопрос. – martincarlin87