在表单提交时使用 sinatra 检索参数。参数未定义

Retrieving params with sinatra on form submit. Params is undefined

我在提交表单后无法访问 Sinatra 中的参数。这是我的表格:

function submitForm(e) {
    e.preventDefault();

    $.ajax({
      type: 'POST',
      url: '/mix_addresses',
      //grab the inputs from address_section
      //data: $('.add_address_section .add_address_field').map(function() { return $(this).val() }),
      data: [1,2,3],
      dataType: "json",
      success: function(data) {
        debugger;
      }
    });
  }

这是我的终点:

require 'sinatra'
require 'jobcoin_client'

get '/' do
  erb :add_coins
end

post '/mix_addresses' do
  puts params
end

我即将到达终点,但参数为空。不应该是[1,2,3]吗?相反,它是:

{"undefined"=>""}

有人看到我做错了什么吗?

这里有几个问题:)

Sinatra 配置

主要问题是 Sinatra 默认不处理 JSON 负载。如果你想发送 JSON 负载,那么最简单的解决方案是:

  1. 要将 rack-contrib 添加到您的 Gemfile,
  2. 然后,在您的 sinatra 应用程序中要求它:require rack/contrib
  3. 并加载处理这个问题的中间件:use Rack::PostBodyContentTypeParser

你应该可以开始了!

来源:几个 SO post 参考这个问题,例如 here, here or here

jQueryajax来电

另请注意,您的请求可能存在一些问题:

  1. 您需要为 JSON 负载使用 key: value 格式:{ values: [1,2,3] }
  2. 您需要在发送之前将您的 JSON 有效负载字符串化:data: JSON.stringify( ... )
  3. 您需要将请求内容类型设置为application/jsondataType与服务器返回的数据有关,并没有说明您的请求格式,请参阅jQuery ajax documentation for more details).

最终,您应该在客户端得到这样的结果:

function submitForm(e) {
  e.preventDefault();

  $.ajax({
    type: 'POST',
    url: '/mix_addresses',
    contentType: 'application/json',
    dataType: 'json',
    data: JSON.stringify({ values: [1,2,3] }),
    success: function(data) {
      debugger;
    }
  });
}