Rails ajax成功事件没有解雇

时间:2013-12-24 17:18:51

标签: jquery ajax coffeescript ruby-on-rails-4

我正在努力让任何Rails ajax事件发生。我已经尝试将其简化为Rails指南中最简单的例子,但没有成功。

我有一个包含以下表单的页面:

<h1 id="title_line">Zone</h1>
<%= form_for(@zone, remote: true) do |f| %>
  <div id="test_text">Test text</div>
  <%= f.hidden_field :operation, value: 'warmer' %>
  <%= f.submit 'Warmer' %>
<% end %>

生成的表单代码是

<form accept-charset="UTF-8" action="/zones/2" class="edit_zone" data-remote="true" id="edit_zone_2" method="post">
  <div style="margin:0;padding:0;display:inline">
    <input name="utf8" type="hidden" value="&#x2713;" />
    <input name="_method" type="hidden" value="patch" />
  </div>
  <input id="zone_operation" name="zone[operation]" type="hidden" value="warmer" />
  <input name="commit" type="submit" value="Warmer" />
</form>

在zones.js.coffee中我有

$(document).ready ->
  $(".edit_zone").on("ajax:success", (e, data, status, xhr) ->
    $("#test_text").append("Ajax success!")
  ).bind "ajax:error", (e, xhr, status, error) ->
    $("#test_text").append("Ajax failure!")

导致生成的javascript

(function() {
  $(document).ready(function() {
    return $(".edit_zone").on("ajax:success", function(e, data, status, xhr) {
      return $("#test_text").append("Ajax success!");
    }).bind("ajax:error", function(e, xhr, status, error) {
      return $("#test_text").append("Ajax failure!");
    });
  });
}).call(this);

控制器更新方法包含(减去不相关的东西)

def update
  @zone = Zone.find(params[:id])
  logger.debug "* update running"
  respond_to do |format|
    format.html { redirect_to zone_path(@zone), :notice => 'zone was successfully updated.' }
    format.json { head :ok }
    format.js { render :show}
  end
end

show.js.erb就是

$("#title_line").append(" (a test)")

当我点击表单提交按钮时,a test会附加到Zone,但#test_text div不会附加任何内容。 rails日志显示

Started PATCH "/zones/2" for 75.67.229.139 at 2013-12-24 11:37:08 -0500 
Processing by ZonesController#update as JS 
 Parameters: {"utf8"=>"✓", "zone"=>{"operation"=>"warmer"}, "commit"=>"Warmer", "id"=>"2"} 
  User Load (2.1ms)  SELECT `users`.* FROM `users` WHERE `users`.`id` = 1 LIMIT 1 
  Zone Load (1.8ms)  SELECT `zones`.* FROM `zones` WHERE `zones`.`id` = 2 LIMIT 1 
* Make zone warmer 
  Zone Load (1.9ms)  SELECT `zones`.* FROM `zones` WHERE `zones`.`id` = 2 LIMIT 1 
 Rendered zones/show.js.erb (0.9ms) 
Completed 200 OK in 489ms (Views: 33.7ms | ActiveRecord: 7.8ms) 

因此show方法正在运行(如* update running日志条目所示),成功呈现show.js.erb并返回200 OK。但是ajax事件不会将任何文本附加到#test_text。如果我show.js.erb附加到#test_text,它就可以了,所以我知道ID是正确的。

我实际上是在尝试做一些比这更复杂的事情,但如果我不能让这个简单的例子起作用,我就没有希望了。我正在运行ruby 2.0.0p247,rails 4.0.0和Safari 7.我很感激任何帮助。

2 个答案:

答案 0 :(得分:3)

此问题可能是由于缺少data {type: 'script'}

引起的
= form_for(@zone, remote: true, data: {type: 'script'})

这会将data-type="script"属性添加到表单中,uJS将其作为参数ajax传递给jQuery的dataType方法。

根据the docs of jQuery's ajax method

  • 如果未明确指定dataType,则智能推断
  • 如果推断出json,则响应将被解析为Js对象并在出错时返回parse error

答案 1 :(得分:1)

嗯,正如预期的那样,我做的事情显然是愚蠢的。我需要一些页面来请求定期的ajax更新,因此使用了我在某处找到的一些代码,将代码放在app/assets/javascripts/common/ajax.js.coffee中。显然,它会覆盖UJS ajax.js,这是ajax事件处理代码所在的位置。删除该文件解决了问题。但现在周期性的ajax效果不好。那好吧。经验教训。