我正在努力让任何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="✓" />
<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.我很感激任何帮助。
答案 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效果不好。那好吧。经验教训。