programing

Ajax를 통한 레일 플래시 알림

easyjava 2023. 3. 10. 22:51
반응형

Ajax를 통한 레일 플래시 알림

간단히 말하면, 단추가 있어요.클릭 시 플래시 [:notice]를 수신하여 div in$로 표시하는 Ajax 요청을 트리거합니다.

다음은 저의 간략한 견해입니다.

 <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

my show.js.erb

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

$("#content").html("<%=j render partial: "search" %>");

문제는 버튼을 클릭하면 알림이 올바르게 표시된다는 것입니다.그러나 다음 클릭 시에도 동일한 알림이 지속됩니다.검색 부분에는 테이블이 포함되어 있습니다.도와주세요!

여기 리치 펙의 대답 덕분에 제가 일을 하게 된 예가 있습니다.나는 사용할 필요가 있었다.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>

세션

다음 클릭 시에도 같은 알림이 계속된다.

이것은, 에 의해 발생합니다.flash레일의 변수에 저장:

플래시는 세션의 특별한 부분으로, 각 요구에 따라 클리어 됩니다.즉, 여기에 저장된 값은 다음 요청에서만 사용할 수 있으므로 오류 메시지 전달 등에 유용합니다.

문제는 Ajax가 새로운 요청(이것에 대한 참조 필요)으로 간주되지 않기 때문에 HTTP를 통해 다음 번 요청 시까지 데이터가 유지된다는 것입니다.

--

고치다

처음에는 이렇게 해보겠습니다.

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

당신이 안고 있는 가장 큰 문제는 당신이 그 문제를 처리하고 있다는 것이다.flashJS에서 변수를 사용합니다.ERB프리프로세서이는 자산 프리 컴파일을 사용하여 작업을 지원할 수 없음을 의미하기 때문에 문제가 됩니다.

질문을 확인한 후 다음과 같이 콜백을 사용해 보십시오.

#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

--

갱신하다

다음 항목을 포함해야 합니다.success기능성show.js.erb:

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

즉, 전체를 제거할 수 있습니다.ajax에서 전화를 걸다application.js및 로 대체한다.remote: true검색 양식:

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

이 기능이 작동하는 이유는format.js응답 블록, Rails가 로드합니다.[action].js.erb파일을 표시합니다.이는 액션이 완료된 후에만 발생한다는 점을 감안하면success당신의 아약스의 기능.

이렇게 하면 전체 데이터를 제거할 수 있습니다.ajax기능하다application.js상기와 같이 UJS 버전으로 치환합니다.

언급URL : https://stackoverflow.com/questions/23967390/rails-flash-notice-via-ajax

반응형