【发布时间】:2011-11-26 11:50:40
【问题描述】:
我想开始使用 Ajax 事件 ajax:success、ajax:failure、ajax:complete 和 ajax:beforeSend 推荐用于不显眼的 Javascript,例如:
- http://www.simonecarletti.com/blog/2010/06/unobtrusive-javascript-in-rails-3/
- http://www.alfajango.com/blog/rails-3-remote-links-and-forms/
但由于某种原因,它对我不起作用。我错过了一些东西(一些小东西),因为我无法让事件触发我的 Javascript。我希望有人能在我的代码中发现“明显”的错误/遗漏。
关于我的环境的一些细节:
- Rails 3.1
- jQuery (jquery-rails gem)
- 用于服务器端 js 处理的 therubyracer(这对我的示例并不重要)
为了尝试找出我缺少的东西,我创建了一个简单的测试应用程序,它有一个远程按钮。单击按钮时,我希望触发警报框。这个应用的代码可以在github上看到:
http://github.com/jpmcgrath/rbtest
我已经将应用部署到heroku这里:
http://rbtest.heroku.com/projects/
如果你看app,可以点击按钮,按钮成功创建新项目(看到手动刷新),但是ajax:success事件好像没有发生?
代码内容如下:
在 projects_controller.rb 中
def remote_test
@project = Project.new(:name => "remote test")
respond_to do |format|
if @project.save
puts "project saved!\n\n\n"
format.html { redirect_to @project, notice: 'Project was successfully created.' }
format.json { render json: @project, status: :created, location: @project }
else
format.html { render action: "new" }
format.json { render json: @project.errors, status: :unprocessable_entity }
end
end
end
在 application.js 中
jQuery(document).ready(function() {
jQuery(".remote_button").click(function() {
alert('Handler for .click() called.');
})
.bind("ajax:complete", function() {
alert('complete!');
})
.bind("ajax:beforeSend", function () {
alert('loading!');
})
.bind("ajax:error", function (xhr, status, error) {
alert('failure!');
})
.bind('ajax:success', function(event, data, status, xhr) {
alert('success!');
});
});
在视图projects/index.html.erb
<%= button_to "remote test", remote_test_path, :remote => true, :class => 'remote_button' %>
如果有人能指出我遗漏了什么(我怀疑它与响应类型有关),将不胜感激。
【问题讨论】:
标签: ruby-on-rails-3 jquery ruby-on-rails-3.1 unobtrusive-javascript