【问题标题】:Can't get JSON in Rails无法在 Rails 中获取 JSON
【发布时间】:2014-08-22 14:34:10
【问题描述】:

我正在尝试使用 jQuery 的 ajax 方法向 rails 发出 post 请求。如果我发送 form.elements(),请求的内容类型是 urlencoded,rails 能够使用正确的值填充参数,但浏览器期望响应是 html,因此 response_to format.json 会引发异常(ActionController::未知格式)。

coffeescript:
$(document).on(
    click: ->
      $.ajax
        url: "/projects.json"
        type: "POST"
        contentType: 'json'
        dataType: 'json'
        data: JSON.stringify($('form#new_project').elements())
        success: activateProgressBar
      return false
    , '#submit-button'
  )

Log:    
Processing by ProjectsController#create as HTML
Parameters: {"utf8"=>"✓", "authenticity_token"=>"Eonu3puxtkBUTtyDQNbE059Racfrwu06q/FzwKm1hWE=", "BusinessUnit"=>{"sbu"=>"2"}, "project"=>{"parent_id"=>"1", "project_num"=>"04479", "client_id"=>"101", "project_type_id"=>"1", "name"=>"ascac", "summary"=>"acacac"}, "User"=>{"approver_id"=>"115"}}

如果我使用 serializeArray 设置数据,请求会以 JSON 格式通过,但 params 没有表单数据。

Coffeescript:
  $(document).on(
    click: ->
      $.ajax
        url: "/projects.json"
        type: "POST"
        contentType: 'json'
        dataType: 'json'
        data: JSON.stringify($('form#new_project').serializeArray())
        success: activateProgressBar
      return false
    , '#submit-button'
  )

Log:
Processing by ProjectsController#create as JSON
Parameters: {"action"=>"create", "controller"=>"projects", "format"=>"json"}

知道我做错了什么吗?

【问题讨论】:

  • 你试过用remote: true选项提交表单的方法吗?
  • 今天早上玩了一下。它将请求作为 Javascript 发送,但仍然像 urlencoded 请求一样 - 它获取参数中的数据,但不响应/调用成功方法。
  • 您使用 index.js.erb 文件进行响应,它实际上非常方便。 edgeguides.rubyonrails.org/…

标签: jquery ruby-on-rails ajax json


【解决方案1】:

我最终根据@Iceman 的提示和大量谷歌搜索更改了视图中的 form_for:

form_for @proj, remote: true, html: {:'data-type' => 'application/json'} do |f|

数据来自 params,虽然不是 paramy 格式:

Parameters: {"_json"=>[{"name"=>"utf8", "value"=>"✓"}, {"name"=>"BusinessUnit[sbu]", "value"=>"2"}, {"name"=>"project[parent_id]", "value"=>"1"}, {"name"=>"project[project_num]", "value"=>"04512"}, {"name"=>"project[client_id]", "value"=>"101"}, {"name"=>"User[approver_id]", "value"=>"115"}, {"name"=>"project[project_type_id]", "value"=>"1"}, {"name"=>"project[name]", "value"=>"sxasx"}, {"name"=>"project[summary]", "value"=>"sxasx"}], "project"=>{}}

我用这段代码把它变成了一个可用的哈希:

@form_data = Hash[ params[:_json].map(&:values) ]

我不知道这是否是解决此问题的正确方法,但它有效,我需要继续做其他事情。

顺便说一句,ajax 调用最终看起来像这样:

  form_data = JSON.stringify($('#new_project').serializeArray())
  $.ajax
    url: "/projects.json"
    type: "POST"
    contentType: 'application/json'
    dataType: 'json'
    data: form_data
    success: activateProgressBar

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多