복붙노트

[RUBY-ON-RAILS] 아약스를 통해 플래시 통지를 레일

RUBY-ON-RAILS

아약스를 통해 플래시 통지를 레일

긴 이야기를 짧게, 나는 버튼이 있습니다. $에서 사업부와 디스플레이를 : [주의]을 클릭하면, 나는 아약스 요청이 플래시를 얻을 수있는 트리거 할

여기 내 단축도이다 :

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

 <div id="notice">

 </div>

뷰에서 내 아약스 요청 :

$("#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" %>");

내가 버튼을 클릭하면 문제는 통지 벌금을 표시한다. 그러나 같은 통지도 다음 클릭에 계속. 부분 검색은 테이블하시기 바랍니다 도움을 포함하고 있습니다!

해결법

  1. ==============================

    1.여기에 내가, 리치 펙의 대답 덕분에 작업을 가지고 있다는 예입니다. 나는 확실히 플래시 통지가 지속되지 않았다 있도록 flash.now 사용하는 데 필요한.

    여기에 내가, 리치 펙의 대답 덕분에 작업을 가지고 있다는 예입니다. 나는 확실히 플래시 통지가 지속되지 않았다 있도록 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">&times;</a>
    </div>
    
  2. ==============================

    2.세션

    세션

    이것은 레일의 세션 변수에 저장되는 플래시에 의해 발생합니다 :

    당신이 가진 문제는 내가 새로운 요청으로 아약스 카운트 (이것에 대한 필요성 참조)을 생각하지 않기 때문에, 데이터는 HTTP를 통해 요청하는 다음 번에 계속 것입니다.

    --

    고치다

    나는 처음에 이것을 시도합니다 :

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

    당신이 가진 가장 큰 문제는 당신이 ERB 처리기를 사용하여 JS에서 플래시 변수를 처리하고있다. 그것은 당신이 작업 할 수 있도록 자산 프리 D 파일을 사용할 수 없습니다 의미로이 문제입니다.

    이 질문을보고 한 후, 왜이처럼 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에 성공 기능을 포함한다 :

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

    이 방법은 당신이 application.js에서 전체 아약스 호출을 제거하고 원격으로 대체 할 수있다 : 검색 양식에 대한 사실 :

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

    당신이 format.js의 응답 블록을 사용하는 경우, 레일은 귀하의 의견에 [액션] .js.erb 파일을로드하기 때문에이 작품 이유입니다. 작업이 완료된 후이에만 발생 고려, 그것은 당신의 아약스의 성공 기능에 해당합니다.

    이렇게함으로써 상기 한 바와 같이, 당신은 당신의 application.js에서 전체 AJAX 기능을 제거하고 UJS 버전으로 대체 할 수 있습니다

  3. from https://stackoverflow.com/questions/23967390/rails-flash-notice-via-ajax by cc-by-sa and MIT license