[英]Rails flash notice via ajax
长话短说,我有一个按钮。 点击它,我想要一个ajax请求被触发,它获取flash [:notice]并将其显示在$中的div中
这是我的简短观点:
<input type="button" id="search" value="display"/>
<div id="notice">
</div>
我在视图中的ajax请求:
$("#search").submit(function(){
$.ajax({
type: "POST",
url: //url to my show action
success: function(data){
/*$("#notice").html("<%= flash[:notice] %>");
$("#content").html(data);*/
}
});
return false;
});
我的控制器:
def HomeController < ActionController::Base
def index
end
def show
respond_to do |format|
format.js { flash[:notice] = "" + count.to_s + " results found for " + params[:query][:search_key] + "" }
end
#render :partial => 'search'
end
end
我的show.js.erb
#app/views/dashboard_home/show.js.erb
$("#notice").html("<%=j flash[:notice] %>");
$("#content").html("<%=j render partial: "search" %>");
问题是当我点击按钮时,通知显示正常。 但同样的通知也会在下一次点击中持续存在。 搜索部分包含表请帮忙!
感谢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
<div id="flash">
<% if notice.present? %>
<%= render partial: "shared/notice_banner" %>
<% end %>
</div>
# app/views/shared/_notice_banner.html.erb
<div data-alert class="alert-box">
<%= notice %>
<a href="#" class="close">×</a>
</div>
会议
同样的通知也会在下一次点击中持续存在
这是由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
包含success
功能:
#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的success
功能。
通过这样做,您将能够从application.js
删除整个ajax
函数,并替换为UJS版本,如上所述
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.