需要Rails控制器返回flash消息以响应AJAX请求的方法吗
作为一名经验不足但快速学习的Rails开发人员,我想编写一个controller after filter,用于检查AJAX请求并在自定义头中返回一些HTML,响应处理程序可以使用这些HTML来显示任何flash消息 为了与DRY保持一致,我想使用Rails生成的相同app/views/layouts/_messages.HTML.erb(.haml)创建部分HTML 在看了几篇文章之后,我的解决方案是:需要Rails控制器返回flash消息以响应AJAX请求的方法吗,ajax,ruby-on-rails-4,Ajax,Ruby On Rails 4,作为一名经验不足但快速学习的Rails开发人员,我想编写一个controller after filter,用于检查AJAX请求并在自定义头中返回一些HTML,响应处理程序可以使用这些HTML来显示任何flash消息 为了与DRY保持一致,我想使用Rails生成的相同app/views/layouts/_messages.HTML.erb(.haml)创建部分HTML 在看了几篇文章之后,我的解决方案是: # adapted from http://stackoverflow.com/a/2
# adapted from http://stackoverflow.com/a/2729454/270511
def flash_to_headers
return unless request.xhr?
response.headers['X-flash'] = render_to_string partial: 'layouts/messages.html'
flash.discard # don't want the flash to appear when you reload page
end
这实际上会返回所需的标题,但也会返回
随后的搜索揭示了一些帖子,其中受访者声称不支持从after筛选器调用render_to_字符串
我正在考虑的另一种解决方案是从views/layouts/application.html.haml第二次呈现layouts/navigation.html,但要包含在display=none的div中。为了使用相同的模板实现这一点,我必须向flash[:notice、:warn和:error]中添加一些虚拟占位符消息,因为否则_messages.html.haml是为了在没有相关消息时不呈现节而编写的。然后我可以使用占位符作为模板来克隆和填充后续AJAX请求返回的flash消息
虽然这可能管用,但我认为它很难看,而且有一股难闻的气味。(我在Rails方面没有经验,但在软件开发方面没有经验!)可能是因为我缺乏Rails方面的经验(以及缺乏可用的导师),所以错过了一些东西。如果是这样的话,如果有人能指出一种更干净的方式来实现我的目标,我将不胜感激
如果没有,我将把它重新发布到Github上rails的问题列表中。我认为,显示flash消息以指示AJAX请求对最终用户的一些反馈是一个非常常见的用例,Rails应该更好地支持它我认为我的Ajax请求是API调用,因此我只在消息头中发送最少的信息,并且只发送最相关的错误消息。 应用程序\u controller.rb 呈现错误消息的作业应属于javascript文件 一些_js_file.js
//AJAX回调
$(文档).ajaxComplete(函数(e,请求,选项){
fireFlash(request.getResponseHeader('X-Message')、request.getResponseHeader('X-Message-Type');
});
$(文档).ajaxError(函数(事件、jqxhr、设置、thrownError){
fireFlash(“AJAX请求失败:“+jqxhr.status+”“+thrownError,”危险”)
});
/*AJAX闪存消息*/
功能fireFlash(内容、类型){
如果(内容===null){
回来
}
var警报类型;
开关(类型){
案例“警报”:
“危险”案例:
"致命个案:
案例“错误”:
警报类型=“危险”
打破
“成功”案例:
案例“通知”:
警报\u type=“成功”
打破
案例“警告”:
警报\u type=“警告”
违约:
警报类型=“信息”
}
$(“#闪烁”)。前置($(“”)
.addClass(“警报-可解除警报-ajax警报-”+警报类型)
.html((解码组件(转义(内容)))
.append(“×;Close”)
)
document.location.href=“#top”;
}
有一个原因,你为什么不考虑使用标准的unabtrusijavascript,你在Rails中的动作中使用FALATAT.JS,调用一个普通的JS函数,从每个Ajax调用返回的Cealt.j.Erb、UpDAT.j.Erb等中闪出一个消息?我想我现在已经在做类似的事情了。为AJAX flash消息创建占位符的逻辑在layouts/application.html.haml中,它通过使用占位符消息呈现生成的_message.html.haml部分来实现。克隆占位符并显示接收到的消息的Javascript目前是Ajax响应处理程序的本地代码,但很快我将把它隔离在一个单独的文件中,然后将整个内容打包到它自己的gem中,供社区审查和改进。谢谢你的想法。
return unless request.xhr?
if type = priority_flash # Method that returns most relevant message
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
// AJAX callbacks
$(document).ajaxComplete(function(e, request, opts) {
fireFlash(request.getResponseHeader('X-Message'), request.getResponseHeader('X-Message-Type'));
});
$(document).ajaxError(function(event, jqxhr, settings, thrownError){
fireFlash("AJAX request failed : " + jqxhr.status + " "+thrownError, "danger")
});
/* AJAX Flash messages */
function fireFlash(content, type){
if (content === null){
return
}
var alert_type;
switch(type){
case "alert":
case "danger":
case "fatal":
case "error":
alert_type= "danger"
break;
case "success":
case "notice":
alert_type= "success"
break;
case "warning":
alert_type= "warning"
default:
alert_type= "info"
}
$("#flashes").prepend($("<div/>")
.addClass("alert alert-dismissible alert-ajax alert-"+alert_type)
.html((decodeURIComponent(escape(content))))
.append('<button type="button" class="close" data-dismiss="alert"><span aria-hidden="true">×</span><span class="sr-only">Close</span></button>')
)
document.location.href = "#top";
}