2015-07-20 127 views
0

我想这将是简单的,因为我经常使用AJAX来更新通过存在于DOM的实际形式模型,但是试图发送我遇到了问题,一个JSON对象时试图让它工作。发送通过AJAX POST请求JSON对象到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的控制器

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

,但我仍然不能得到的p成功打印原始JSON对象的roperty,例如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: '应用程序/ json''到'的contentType: “应用/ JSON的;字符集= UTF-8”,数据类型: “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 
    } 
}); 
相关问题