如何修改beforeSend事件中的ajax Post数据?

时间:2011-10-24 21:07:17

标签: javascript jquery ruby-on-rails ruby-on-rails-3 ujs

您好我有一个使用jQuery UJS for rails远程提交的表单。我绑定到beforeSend事件,允许我修改提交给服务器的数据。它不起作用。以下是我在beforeSend中的内容:

 settings.data = JSON.stringify({
      'list_item[title]' : 'hi?? there'
 })

这不起作用。在服务器日志中,我看到了:

Started POST "/lists/9/list_items" for 127.0.0.1 at 2011-10-24 14:04:36 -0700
  Processing by ListItemsController#create as JSON
  Parameters: {"{\"list_item"=>{"title"=>{"\":\"hi?? there\"}"=>nil}}, "list_id"=>"9"}

知道我做错了什么吗?我想自定义settings.data,添加不在表单中的字段。感谢

1 个答案:

答案 0 :(得分:2)

您无需将任何内容字符串化以将其放入settings.datadata is

  

要发送到服务器的数据。如果不是字符串,它将转换为查询字符串。它附加到GET请求的URL。 [...]对象必须是键/值对。

你正在做的是把这个字符串:

"{"list_item[title]":"hi?? there"}"

进入data,但该字符串不是查询字符串,所以事情会变得混乱。您应该能够简单地将JavaScript对象分配给settings.data

settings.data = { 'list_item[title]' : 'hi?? there' };

让jQuery从那里排序。


基于证据而非文档更新:

然而,进一步调查显示这不起作用。如果我发送GET请求,我对settings.data所做的任何更改都会被忽略,但是如果我发送了POST请求,那么更改为settings.data,但你必须使用查询字符串格式才能获得任何明智的结果:

settings.data = encodeURIComponent('list_item[title]')
              + '='
              + encodeURIComponent('hi?? there');

settings.data的版本与POST请求结合使用了我:

Parameters: {"list_item"=>{"title"=>"hi?? there"}}

在服务器上,看起来像你在追求的。如果你想保留一些原始参数,那么你必须手动解包并重新打包查询字符串。