以前,在rails 2.3.8中,我使用了原型助手link_to_remote
和form_remote_for
(以及其他)。
这些选项:update
如下:
link_to_remote "Add to cart",
:url => { :action => "add", :id => product.id },
:update => { :success => "cart", :failure => "error" }
(来自documentation的示例)。 这个例子在成功更新带有“cart”类的html元素时,失败后会出现“错误”类。
现在我相信作案手法已经改变,而是写下来:
link_to "Add to cart", :url => {:action => "add", :id => product.id},
:remote => true
并且无法再设置:update
。
而不是普通的html,我们现在渲染javascript,就像这样(在jquery中):
$('.cart').replaceWith(<%= escape_javascript(render :partial => 'cart') %>)
但你如何处理错误情况? 我是否在控制器中处理它,并使用单独的视图?
以某种方式能够模仿我们之前的行为似乎对我有用。有什么想法吗?
答案 0 :(得分:71)
哈!我在this文章中找到了它。在rails.js中,检查以下回调:
由于javascript应该不引人注目,因此不会在HTML中进行此耦合。
示例(来自同一站点):以下Rails 2.3.8
<% form_remote_tag :url => { :action => 'run' },
:id => "tool-form",
:update => { :success => "response", :failure => "error" },
:loading => "$('#loading').toggle()", :complete => "$('#loading').toggle()" %>
被翻译成:
<% form_tag url_for(:action => "run"), :id => "tool-form", :remote => true do %>
并在一些javascript(application.js)中绑定事件
jQuery(function($) {
// create a convenient toggleLoading function
var toggleLoading = function() { $("#loading").toggle() };
$("#tool-form")
.bind("ajax:loading", toggleLoading)
.bind("ajax:complete", toggleLoading)
.bind("ajax:success", function(xhr, data, status) {
$("#response").html(status);
});
});
大! :)
[更新日期:29/12/2011]
最近有两个事件被重命名:
ajax:beforeSend
:替换迟到的ajax:loading
ajax:error
取代了ajax:failure
(我想更符合jQuery本身)所以我的例子会变成:
$("#tool-form")
.bind("ajax:beforeSend", toggleLoading)
.bind("ajax:complete", toggleLoading)
.bind("ajax:success", function(xhr, data, status) {
$("#response").html(status);
});
为了完整性,事件及其预期参数:
.bind('ajax:beforeSend', function(xhr, settings) {})
.bind('ajax:success', function(xhr, data, status) {})
.bind('ajax:complete', function(xhr, status) {})
.bind('ajax:error', function(xhr, data, status) {})
答案 1 :(得分:4)
相关的rails 4指南可在以下网址找到:http://guides.rubyonrails.org/working_with_javascript_in_rails.html
如ncherro
所述,它指向了https://github.com/rails/jquery-ujs/wiki/ajax上的事件文档传递给回调的实际值可以从jQuery&#39; ajax
方法http://api.jquery.com/jquery.ajax/#jQuery-ajax-settings
.bind
所以现在推荐的方法是:
模板:
<%= link_to 'Click me!',
'path/to/ajax',
remote: true,
id: 'button',
method: :get,
data: {type: 'text'}
%>
CoffeScript:
$(document).ready ->
$("#button").on("ajax:success", (e, data, status, xhr) ->
alert xhr.responseText
).on "ajax:error", (e, xhr, status, error) ->
alert "error"
答案 2 :(得分:1)
我知道这个问题已经过了3年,但是谷歌搜索结果很高,上面列出的一些活动不再使用了。
请点击此处查看最新列表 - https://github.com/rails/jquery-ujs/wiki/ajax