Rails通过ajax闪烁通知

长话短说,我有一个按钮。 点击它,我想要一个ajax请求被触发,它获取flash [:notice]并将其显示在$中的div中

这是我的简短观点:

 

我在视图中的ajax请求:

 $("#search").submit(function(){ $.ajax({ type: "POST", url: //url to my show action success: function(data){ /*$("#notice").html(""); $("#content").html(data);*/ } }); return false; }); 

我的控制器:

 def HomeController  'search' end end 

我的show.js.erb

 #app/views/dashboard_home/show.js.erb $("#notice").html(""); $("#content").html(""); 

问题是当我点击按钮时,通知显示正常。 但同样的通知仍然存在于下一次点击中。 搜索部分包含表格请帮忙!

会议

同样的通知也会在下一次点击中持续存在

这是由flash 存储在Rails的session变量中引起的 :

闪存是会话的一个特殊部分,每次请求都会清除闪存。 这意味着存储在那里的值只能在下一个请求中使用,这对于传递错误消息等很有用。

您遇到的问题是,由于我认为ajax不会被视为新请求(需要参考),因此数据将在您下次通过HTTP请求时保留。

固定

我最初会尝试这个:

 def show respond_to do |format| format.js { flash[:notice] = "my secret number "+rand(0,5)+" !" } end end 

您遇到的主要问题是您使用ERB预处理器在JS中处理flash变量。 这是一个问题,因为这意味着您将无法使用资产预编译来帮助它工作。

看了这个问题之后 ,为什么不尝试使用after_filter回调 ,如下所示:

 #app/controllers/home_controller.rb Class Home < ActionController::Base after_filter { flash.discard if request.xhr? }, only: :show def show respond_to do |format| format.js { flash[:notice] = "my secret number "+rand(0,5)+" !" } end end end 

-

更新

您应该在show.js.erb包含successfunction:

 #app/views/home/show.js.erb $("#notice").html("<%= flash[:notice] %>"); 

这意味着您可以从application.js删除整个ajax调用,并替换为您的搜索表单的remote: true

 #app/views/search/index.html.erb <%= form_tag home_show_path, remote: true %> 

这样做的原因是因为当你使用format.js响应块时,Rails会在你的视图中加载[action].js.erb文件。 考虑到这一点只动作完成才会发生,它等同于你的ajax的successfunction。

通过这样做,您将能够从application.js删除整个ajax函数,并替换为UJS版本,如上所述

感谢Rich Peck的回答,这是我工作的一个例子。 我需要使用flash.now来确保闪存通知不会持续存在。

视图中的AJAX触发器:

 <%= link_to "Email report", users_path, remote: true %> 

控制器:

 # app/controllers/users_controller class UsersController < ApplicationController def index # do some things here respond_to do |format| format.js { flash.now[:notice] = "Here is my flash notice" } end end end 

渲染视图:

 # app/views/users/index.js.erb $("#flash").html('<%= j render partial: "shared/notice_banner" %>'); 

闪存通知显示在布局中的位置:

 # app/views/layouts/application.html.erb 
<% if notice.present? %> <%= render partial: "shared/notice_banner" %> <% end %>
# app/views/shared/_notice_banner.html.erb
<%= notice %> ×