Notice For Ajax Request In Rails

2 分钟 阅读

当一个Rails的Form以Remote的方式提交时,自带的Flash Notice通知方式就不在有效了。现在的Web开发越来越重视客户端,Ajax请求越来越多,因此需要有一个统一的方式来显示异步操作的通知。

把通知消息用JSON返回?

可以,但是不可行;有的更新操作不需要返回任何数据。在正常返回json数据的时候,如何把这个通知消息插入到结果中,怎么插入等等,变数太多,不同意。

利用ResponseHeader

利用Rails的after_filter把通知消息放到ResponseHeader中.

```ruby Insert Notice Message to Response Header after_filter :flash_to_headers

def flash_to_headers return unless request.xhr? if !flash[:notice].blank? or !flash[:error].blank? response.headers[‘X-Flash-Message’] = flash[:notice] || flash[:error] end response.headers[‘X-Flash-Type’] = flash[:type] unless flash[:type].blank? # repeat for other flash types…

flash.discard  # don't want the flash to appear when you reload page end ```

设置Flash-Type和Message

flash[:type] = 'success'
flash[:notice] = '密码修改成功'

设置全局AjaxComplete响应

$( document ).ajaxComplete(function( event, xhr, settings ) {
	if (xhr.status < 200 || xhr.status >= 300) return;
	var message = xhr.getResponseHeader("X-Flash-Message")
	if($('div#flash') != null && message ){
		var type = xhr.getResponseHeader("X-Flash-Type")
		$('div#flash').addClass("alert-" + type).html(message).show().fadeOut(3000, function()
		{
			$('div#flash').removeClass('alert-' + type)
		})
	}
});

这样在异步请求下通知的显示方式就又统一了。 可以把after_filter加入到application_controller中,然后只需要在response_to中设置消息的内容和类型。

分类:

最新的:

留下评论