Rails AJAX 反馈,尤其是错误
Rails AJAX Feedback, especially on error
我想改进我的应用程序中的 AJAX 反馈(在我 POST 我的模式中的远程表单等之后)。
我已经收到一些显示加载动画的不错反馈
$(document).ajaxStart(function(){
$('.loading-feedback').show()
})
$(document).ajaxStop(function(){
$('.loading-feedback').hide()
})
但我意识到这还不够:当我的 AJAX 请求触发 Completed 500 Internal Server Error in 1985ms
... 好吧,用户什么也没发生。
例如,我想在我的前端显示一条警告消息。
我已经有一些代码可以显示我存储在 AJAX 响应中的一些即时消息,我想为此重用这些消息(例如,通过显示 oops, your AJAX request triggered a #{err_code} #{err_description}. Please tell the devs :D
我有以下代码,它在 AJAX 请求后成功显示 bootstrap 闪烁(在我的控制器中定义了 content/type 闪烁)
application_controller.rb
after_filter :ajax_flash
def ajax_flash
return unless request.xhr?
if type = priority_flash
response.headers['X-Message'] = flash[type]
response.headers['X-Message-Type'] = type.to_s
flash.discard # don't want the flash to appear when you reload page
end
end
相关javascript
$(document).ajaxComplete(function(e, request, opts) {
fireFlash(request.getResponseHeader('X-Message'), request.getResponseHeader('X-Message-Type'));
# Where fireFlash is a function that displays a bootstrap alert
});
但是现在,如果出现错误,我的控制器操作将只是 return。
是否可以检测到这一点,例如填充闪光灯
flash[:fatal] = "oops, your AJAX request triggered a #{err_code} #{err_description}. Please tell the devs :D"
那会显示在我的前端吗? (请注意,我不知道在哪里可以找到 err_code 和 err_description)
这样使用。
$loader.fadeIn();
jqXHR = $.ajax({
url: "",
type: "POST",
data: {},
dataType: "json"
});
jqXHR.done(function( response ) {
});
jqXHR.fail(function( jqXHR, textStatus ) {
console.log( "Request failed: " + textStatus );
});
jqXHR.always(function( jqXHR, textStatus ) {
$loader.fadeOut();
});
您不需要使用 Ajax 创建即显消息。
由于即显消息是非持久性的,并且在呈现时会从会话中删除,您可以通过修改文档来创建新的即显消息。
这是一个最小的 Flash 实现:
$(document).on('flash', function(e, key, message){
var $flash = $('<li class="alert flash js-created"></li>')
.addClass("alert-" + key)
.html(message);
$(this).find('.flashes').append($flash);
});
Turbolinks 将清理闪光灯以供使用,因为它会取代整个 <body>
。
您可以使用 ajaxError
而不是 ajaxStop
添加全局 ajax 故障处理程序。
var $doc = $(document);
$doc.ajaxError(function(event, jqxhr, settings, thrownError){
$doc.trigger('flash', ['error', jqxhr.status + thrownError]);
});
我想改进我的应用程序中的 AJAX 反馈(在我 POST 我的模式中的远程表单等之后)。
我已经收到一些显示加载动画的不错反馈
$(document).ajaxStart(function(){
$('.loading-feedback').show()
})
$(document).ajaxStop(function(){
$('.loading-feedback').hide()
})
但我意识到这还不够:当我的 AJAX 请求触发 Completed 500 Internal Server Error in 1985ms
... 好吧,用户什么也没发生。
例如,我想在我的前端显示一条警告消息。
我已经有一些代码可以显示我存储在 AJAX 响应中的一些即时消息,我想为此重用这些消息(例如,通过显示 oops, your AJAX request triggered a #{err_code} #{err_description}. Please tell the devs :D
我有以下代码,它在 AJAX 请求后成功显示 bootstrap 闪烁(在我的控制器中定义了 content/type 闪烁)
application_controller.rb
after_filter :ajax_flash
def ajax_flash
return unless request.xhr?
if type = priority_flash
response.headers['X-Message'] = flash[type]
response.headers['X-Message-Type'] = type.to_s
flash.discard # don't want the flash to appear when you reload page
end
end
相关javascript
$(document).ajaxComplete(function(e, request, opts) {
fireFlash(request.getResponseHeader('X-Message'), request.getResponseHeader('X-Message-Type'));
# Where fireFlash is a function that displays a bootstrap alert
});
但是现在,如果出现错误,我的控制器操作将只是 return。 是否可以检测到这一点,例如填充闪光灯
flash[:fatal] = "oops, your AJAX request triggered a #{err_code} #{err_description}. Please tell the devs :D"
那会显示在我的前端吗? (请注意,我不知道在哪里可以找到 err_code 和 err_description)
这样使用。
$loader.fadeIn();
jqXHR = $.ajax({
url: "",
type: "POST",
data: {},
dataType: "json"
});
jqXHR.done(function( response ) {
});
jqXHR.fail(function( jqXHR, textStatus ) {
console.log( "Request failed: " + textStatus );
});
jqXHR.always(function( jqXHR, textStatus ) {
$loader.fadeOut();
});
您不需要使用 Ajax 创建即显消息。
由于即显消息是非持久性的,并且在呈现时会从会话中删除,您可以通过修改文档来创建新的即显消息。
这是一个最小的 Flash 实现:
$(document).on('flash', function(e, key, message){
var $flash = $('<li class="alert flash js-created"></li>')
.addClass("alert-" + key)
.html(message);
$(this).find('.flashes').append($flash);
});
Turbolinks 将清理闪光灯以供使用,因为它会取代整个 <body>
。
您可以使用 ajaxError
而不是 ajaxStop
添加全局 ajax 故障处理程序。
var $doc = $(document);
$doc.ajaxError(function(event, jqxhr, settings, thrownError){
$doc.trigger('flash', ['error', jqxhr.status + thrownError]);
});