通过AJAX请求发送Flash消息

时间:2014-01-27 13:45:19

标签: jquery ruby-on-rails ajax

目标

我希望在我的视图中使用flash[:error]和AJAX请求。

问题

我真的只是不知道如何表现。

场景

如果用户的身份验证失败,则会发生这种情况:

flash[:error] = t('globals.errors.authentication.user-not-found').to_json
render :json => flash[:error]

重点是:在我看来,在这种情况下,flash[:error]没有被正确使用。也许这个概念是正确的,但从技术上讲,我可以将flash错误转换为正常变量,结果也是一样。

然后我问:有一种方法可以使用带有AJAX请求的Flash消息吗?

客户端

这就是我从控制器接收消息的方式:

$.ajax({
    type: 'POST',
    url: '/authenticate',
    data: $(this).serialize(),
    dataType: 'JSON',
    success: function(response) {
        console.log(response); // Here!
    }
});

有错误吗?

没有。没有。正如我在问题部分所说:我真的只是不知道如何执行[目标]

我已经尝试了什么

嗯......在success的{​​{1}}属性中,我试图将$.ajax放在那里,但它没有意义,因为还没有错误 - 它随附AJAX的回应。

提前致谢。

如果flash消息与AJAX配对不起......

使用正常变量(如下所示),这是正确/干/好的做法吗?

flash[:error]

TL; DR

我只是想从控制器传递来查看一些快速且易于设置的错误消息,并且我试图通过AJAX请求传递它。我可以通过 Flash消息执行此操作吗?如果是这样,怎么样?如果不这样做,简单/普通/字符串变量可以满足我的需要吗?

1 个答案:

答案 0 :(得分:0)

Rails中的flash消息只是传递给视图的一次性参数。通常,ERB或HAML模板/布局检查变量,然后打印包含在其中的消息。使用AJAX时,您很可能无法呈现整页,因此不会执行此检查。

您可以在AJAX请求期间返回的部分中呈现错误(如果您这样做),但更好的做法是让请求失败(返回错误的HTTP代码,如403或类似)并返回像你自己建议的JSON错误信息。

在这里查找适当的代码:( 400以上的任何内容都被视为错误) http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html

render :json => error.to_json, :status => :403

render :partial => 'error_page.html.erb', :locals => {:errors => element.errors}

访问AJAX的error部分中的消息,并在页面的某个位置或弹出窗口中显示文本。 (解析JSON的响应,或者如果呈现为部分则直接打印)

$.ajax {
    ...
    success: function(response) { // do other stuff }
    error: function(response){
        $('#error_container').html(response).show(); }
}

长话短说:

您无法直接访问AJAX返回值中的rails flash消息,除非您手动传递它们或在模板中呈现它们并返回此呈现的页面而不是JSON。

相关问题