Coffeescript没有处理ajax:成功

时间:2012-11-13 14:37:49

标签: jquery coffeescript ruby-on-rails-3.2

上周在一个问题中作为I mentioned,我正在使用@coreywardexcellent walk-through来处理Rails 3中的模态编辑窗口。但是,我是Coffeescript的相对新手,我遇到了代码,它应该在成功的Ajax响应上显示模态窗口。这是相关函数(来自Corey's gist):

$ ->
  $modal = $('#modal')
  $modal_close = $modal.find('.close')
  $modal_container = $('#modal-container')

  # Handle modal links with the data-remote attribute
  $(document).on 'ajax:success', 'a[data-remote]', (xhr, data, status) ->
    $modal
      .html(data)
      .prepend($modal_close)
      .css('top', $(window).scrollTop() + 40)
      .show()
    $modal_container.show();

  $(document).on 'click', '#modal .close', ->
    $modal_container.hide()
    $modal.hide()
    false

我已经确定函数内的所有代码都有效;它永远不会被召唤。我可以在Chrome网络面板中看到Ajax查询,并验证它是否返回了正确的响应。

我简化了代码以在ajax:success事件上弹出提醒:

  $(document).on 'ajax:success', () -> 
    alert('Ajax success event!')

......什么都没有。所以我认为'ajax:success'事件永远不会发生。

尝试提取重复问题的最简单的代码,我使用以下代码设置this jsFiddle

<a href="javascript:$.ajax('/echo/js/?delay=2&js=WHEEEEE!');" data-remote="true">Edit</a>​

$(document).on 'ajax:success', () -> 
  alert('Ajax success event!')

...是啊。没有。 jsFiddle Ajax echo返回它应该的内容,但函数永远不会被调用。所以我对.on('ajax:success')做错了。 (这是与this question相反的问题,因此答案没有帮助。This question,关于响应的mime类型,看起来很有希望,但没有解释为什么jsFiddle没有不行,因为那不会触碰我的控制器。)这是什么?

ETA:我应该提到这里涉及的堆栈。 捂脸

  • Rails 3.2.8
  • jquery-rails 2.1.3
  • ...表示jQuery 1.8.2

1 个答案:

答案 0 :(得分:0)

好的,明白了。我需要做两处修改:

  • 首先,根据this answer的建议,我需要在响应中返回text/json MIME类型。我以前的行动看起来像这样:
  def edit
    respond_to do |format|
      format.js
      format.html
    end
  end

为了获得text/json回复,我结束了这个:

  def edit
    respond_to do |format|
      format.js { render :json => { :html => render_to_string('edit')}, :content_type => 'text/json' }
      format.html
    end
  end

该更改触发了ajax:success,因此运行了开放模式函数。

  • 但是,由于响应有效负载现在位于data.html而非data,我需要调整modal.js.coffee以实际将标记放入模式中:
  .html(data.html) // instead of .html(data)