当用户想要执行需要他首先登录的操作时,设计会将他重定向到登录页面并设置一条闪烁消息:“请在继续之前登录或注册”。这适用于no-ajax请求。但是,如果ajax请求首先需要登录,它将响应401错误,我们应该手动处理它,如下所示:
$.ajax({
url: '/books/user_score',
type: 'POST',
data: { score: value, book_id: book_id },
dataType: 'json',
success: function(data) {
bookStarWidget.data('starInfo', data.book_star);
setVote(bookStarWidget);
$("[name='my_vote']").rating('disable');
},
error: function(jqXHR, textStatus, errorThrown) {
if (jqXHR.status == 401) {
window.location.assign('/users/sign_in');
}
}
});
在上面的代码中,我们在收到401错误设备发送时手动打开登录页面。 问题是以这种方式设置没有闪存消息。那么有人可以像往常一样知道如何设置Flash消息以保持一致的行为吗?
答案 0 :(得分:1)
看起来您正在使用javascript在错误案例中设置位置。 Devise有一个配置选项,它会在失败时重定向,而不是返回http标头。此设置默认为true,这会强制您手动处理xhr上的故障。以下是来源的解释:https://github.com/plataformatec/devise/blob/master/lib/devise/failure_app.rb#L120
所以,在你的Devise配置中:
config.http_authenticatable_on_xhr = false
再次尝试未经身份验证的ajax请求,Devise将为您执行重定向,这应该按照您的预期设置Flash消息。