【问题标题】:Sending a JSON Object via AJAX POST Request to Rails Controller通过 AJAX POST 请求向 Rails 控制器发送 JSON 对象
【发布时间】:2015-10-09 15:52:38
【问题描述】:

我认为这很简单,因为我经常使用 AJAX 通过 DOM 中存在的实际表单来更新模型,但是在尝试发送 JSON 对象时,我在尝试使其工作时遇到了问题。

我知道有很多类似的问题,但就 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

但我仍然无法成功打印原始 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] 行有关,这是由于 nil 对象而导致的无方法错误。

这是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"}

【问题讨论】:

  • 只需使用简单的data: { form_data : form_data }。你能发布你的控制器吗?
  • 这只是一个猜测,但请尝试一下:将 contentType: 'application/json' 更改为 `contentType:"application/json; charset=utf-8", dataType:"json",'
  • 感谢您的建议,我都实现了,控制器现在很简单,我已经更新了问题。
  • 如果你只是简单地记录这个参数[:params]
  • @Athar - 它似乎是空白的。我认为您在使用 application/json 内容类型时只会获得 _json 哈希

标签: jquery ruby-on-rails json ruby ajax


【解决方案1】:

试试这个

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-09
    • 2014-07-28
    • 2014-05-07
    • 2019-01-06
    • 2016-05-17
    • 2021-04-08
    • 2018-01-25
    相关资源
    最近更新 更多