1

编辑:

除了以下有用的评论之外,Steve Schwartz 的两篇优秀文章清楚地解释了一切:

Rails 3.2.2 / jquery-rails 2.0.1 (使用 jquery 1.7.1)

我有发送 AJAX 请求以将其他文件上传字段添加到表单的链接。 与页面相关的所有内容都可以正常工作- 从服务器检索新的表单字段 HTML 片段并将其附加到表单内的 div 中。

然而,

服务器收到两个 GET 请求。一是AJAX请求;另一个似乎是“正常”的锚元素 GET。我预计 Rails UJS 会停止“正常”GET。

我应该自己禁用正常的链接操作吗?有人可以解释我误解了什么,以及我应该做什么[以防止第二个请求]?

我见过这个问题:Rails 3 UJS - controller被link_to :remote 调用两次。因此,我尝试更改资产管道编译config.assets.debug = false,但没有效果。此外,这不是双 AJAX GET 请求,所以我认为这是一个不同的问题。

谢谢你的帮助!

服务器日志片段:

Started GET "/files/new?asset_number=2" for 127.0.0.1 at 2012-03-23 15:23:27 +0100

Started GET "/files/new" for 127.0.0.1 at 2012-03-23 15:23:27 +0100

浏览器 HTML:

<a href="/files/new" data-remote="true" id="add_another_file" position="after" update="files">Add another file</a>

看法:

<%= link_to 'Add another file', new_file_path, :remote   => true,
                                               :update   => 'files',
                                               :position => 'after',
                                               :id       => 'add_another_file' %>

控制器的咖啡脚本:

$( ->
  $('a#add_another_file').click( ->
    url = '/files/new?asset_number=' + $('#files input').length
    $.get(url, ((data) -> $('#files').append(data)), 'html')))
4

3 回答 3

5

如果您想使用该:remote => true选项,您应该删除您添加的自定义点击事件。这是因为该:remote => true选项告诉 *jquery_ujs* 库劫持点击a#add_another_file. 因此,您无需发出自己的 HTTP 请求。

接下来,要指示对响应做了什么,绑定到将在 上发生的各种事件a#add_another_file,例如成功错误

是您可以绑定到的 Ajax 事件的完整列表

于 2012-03-24T02:46:10.917 回答
5

如果要向 中添加click事件a#add_another_file,则不需要使用:remote => true,因为您正在手动发出 Ajax 请求。

此外,该click事件应防止发生默认操作。这可以通过添加event.preventDefault();单击事件回调的开头来完成。请注意,回调需要接受event参数。

于 2012-03-23T15:11:06.390 回答
1

这实际上非常简单,您的遥控器link_to正在发送一个请求(不带参数),并且您在该链接上添加了一个单击事件以发送另一个请求(带参数)。

您应该简化link_to为:

<%= link_to 'Add another file', new_file_path, :id => 'add_another_file' %>

然后在您的click事件中,您应该返回 false 以便它不跟随 url。

看起来您在咖啡脚本中使用了很多不必要的括号。

$ ->
  $('a#add_another_file').click ->
    url = '/files/new?asset_number=' + $('#files input').length
    $.get url, ((data) -> $('#files').append(data)), 'html'
于 2012-03-23T15:11:08.923 回答