Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
需要Rails控制器返回flash消息以响应AJAX请求的方法吗_Ajax_Ruby On Rails 4 - Fatal编程技术网

需要Rails控制器返回flash消息以响应AJAX请求的方法吗

需要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

作为一名经验不足但快速学习的Rails开发人员,我想编写一个controller after filter,用于检查AJAX请求并在自定义头中返回一些HTML,响应处理程序可以使用这些HTML来显示任何flash消息

为了与DRY保持一致,我想使用Rails生成的相同app/views/layouts/_messages.HTML.erb(.haml)创建部分HTML

在看了几篇文章之后,我的解决方案是:

  # 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应该更好地支持它。 应用程序\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">&times;</span><span class="sr-only">Close</span></button>')
    )
    document.location.href = "#top";
}