Rails通过ajax闪烁通知

San*_*one 26 javascript flash ajax jquery ruby-on-rails

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

这是我的简短观点:

 <input type="button" id="search" value="display"/>

 <div id="notice">

 </div>
Run Code Online (Sandbox Code Playgroud)

我在视图中的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;
                    });
Run Code Online (Sandbox Code Playgroud)

我的控制器:

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
Run Code Online (Sandbox Code Playgroud)

我的show.js.erb

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

$("#content").html("<%=j render partial: "search" %>");
Run Code Online (Sandbox Code Playgroud)

问题是当我点击按钮时,通知显示正常.但同样的通知也会在下一次点击中持续存在.搜索部分包含表请帮忙!

lit*_*est 24

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

视图中的AJAX触发器:

<%= link_to "Email report", users_path, remote: true %>
Run Code Online (Sandbox Code Playgroud)

控制器:

# 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
Run Code Online (Sandbox Code Playgroud)

渲染视图:

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

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

# 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">&times;</a>
</div>
Run Code Online (Sandbox Code Playgroud)


Ric*_*eck 21

会议

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

这是由引起flash存在存储在所述session导轨的变量:

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

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

-

固定

我最初会尝试这个:

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

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

看完这个问题后,为什么不尝试使用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
Run Code Online (Sandbox Code Playgroud)

-

更新

您应该success在您的功能中包含以下功能show.js.erb:

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

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

#app/views/search/index.html.erb
<%= form_tag home_show_path, remote: true %>
Run Code Online (Sandbox Code Playgroud)

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

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

  • 不要轻易放弃.告诉我发生了什么 - 我想解决这个问题 (4认同)