【问题标题】:How do I append data to a jquery-ujs post request in Rails?如何将数据附加到 Rails 中的 jquery-ujs 发布请求?
【发布时间】:2011-05-30 20:19:12
【问题描述】:

我有一个带有 data-remote="true" 属性的 Ajax 表单,我将其提交给 rails 中的控制器。

我想做的是使用jquery-ujs event system 在请求发送到服务器之前将数据附加到请求中。

类似这样的:

$("#my_form").bind('ajax:beforeSend', function(xhr, settings){
  // serialize some object and append it
});

我不知道如何实际标记数据?

编辑这就是“xhr”对象在控制台中的样子。

f.Event
currentTarget: DOMWindow
data: undefined
exclusive: undefined
handleObj: Object
handler: function N(a){var b,c,d,e,g,h,i,j,k,l,m,n,o,p=[],q=[],r=f._data(this,"events");if(!(a.liveFired===this||!r||!r.live||a.target.disabled||a.button&&a.type==="click")){a.namespace&&(n=new RegExp("(^|\\.)"+a.namespace.split(".").join("\\.(?:.*\\.)?")+"(\\.|$)")),a.liveFired=this;var s=r.live.slice(0);for(i=0;i<s.length;i++)g=s[i],g.origType.replace(y,"")===a.type?q.push(g.selector):s.splice(i--,1);e=f(a.target).closest(q,a.currentTarget);for(j=0,k=e.length;j<k;j++){m=e[j];for(i=0;i<s.length;i++){g=s[i];if(m.selector===g.selector&&(!n||n.test(g.namespace))&&!m.elem.disabled){h=m.elem,d=null;if(g.preType==="mouseenter"||g.preType==="mouseleave")a.type=g.preType,d=f(a.relatedTarget).closest(g.selector)[0],d&&f.contains(h,d)&&(d=h);(!d||d!==h)&&p.push({elem:h,handleObj:g,level:m.level})}}}for(j=0,k=p.length;j<k;j++){e=p[j];if(c&&e.level>c)break;a.currentTarget=e.elem,a.data=e.handleObj.data,a.handleObj=e.handleObj,o=e.handleObj.origHandler.apply(e.elem,arguments);if(o===!1||a.isPropagationStopped()){c=e.level,o===!1&&(b=!1);if(a.isImmediatePropagationStopped())break}}return b}}
jQuery16103879226385615766: true
liveFired: HTMLDocument
namespace: ""
namespace_re: /(^|\.)(\.|$)/
result: undefined
target: HTMLFormElement
timeStamp: 1306788242911
type: "ajax:beforeSend"
__proto__: Object

【问题讨论】:

  • 您使用的是哪个 jQuery 版本?
  • 看起来你的 POST 是空的
  • 应该在data 对吧?该表单虽然运行良好,但我可以看到数据是在开发工具的网络选项卡中发送的(通过 XMLHttpRequest)。我不明白。
  • 您是否尝试过将“数据”设置为某些内容,例如:“foo=bar”并检查它是否被提交
  • 是的,我试过了。我设置了xhr.data = 'foo',然后在服务器上记录了请求参数。它没有列出。它似乎也没有影响其余的请求参数。那绝对是我持有的 jqXHR 对象吗?

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


【解决方案1】:

最后我自己想出了这个。看起来尽管docs 说了什么,ajax:beforeSend 钩子实际上需要三个参数。根据this helpful blog post,它们依次是eventxhrsettings

我要查找的表单数据位于 settings 参数的 data 属性中。

所以基本上,我现在可以使用函数将数据添加到请求中

$("#my_form").bind('ajax:beforeSend', function(event, xhr, settings){
  settings.data += "&serialized=data";
});

额外的参数将在服务器上可用。

【讨论】:

  • 在 Firebug 中我看到 null&amp;url=http://www.google.com 但在服务器端我看不到 Parameters: {"user_id"=&gt;"13"}
  • @lulalala 我也看到了同样的事情。当我 console.log(settings) 我看到 data: "null&customize=TEST" 并且自定义参数不会持续存在。我正在使用 .on("ajax:beforeSend", "#link", function(e,xhr,settings){ settings.data += "&customize=TEST" }
  • Null 是默认值,如果没有添加数据,你可以写settings.data = "serialized=data",但它可能不起作用。请改用settings.url += '&amp;dog=cat'
  • 现在可能有所不同,因为它已经过时了,但是文档确实引用了 jQuery 的第一个参数将是事件对象。 github.com/rails/jquery-ujs/wiki/ajax#important
【解决方案2】:

从 jQuery 1.5 开始,有一个本地 beforeSend 回调可以绑定到您的请求。 Documentation link 和另一个 documentation link

编辑:请求数据在jqXHR对象中,第一个参数beforeSend回调。

beforeSend(jqXHR, settings)

尝试在 firebug 中检查 jqXHR 对象,以查看它存储 POST 数据的确切位置并附加您的值,

【讨论】:

  • 好的,我在我的问题中有这个问题(由于我使用的是 Ruby on Rails,因此需要采用一种迂回的方式),但我如何实际将数据附加到请求中?
  • 我添加了 XHR 对象的日志。如您所见,data 属性是undefined。我找到正确的对象了吗?
【解决方案3】:

要更改beforeSend 方法(Jquery 原生方法)内的data 属性(至少现在,使用 Jquery 1.7.2),您可以更改 this.data 变量。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-04
    • 1970-01-01
    • 1970-01-01
    • 2020-01-19
    • 1970-01-01
    • 2017-05-23
    相关资源
    最近更新 更多