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">×</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
'programing' 카테고리의 다른 글
| 오류: 'types'는 .ts 파일에서만 사용할 수 있습니다. - @ts-check를 사용하는 Visual Studio 코드 (0) | 2023.03.10 |
|---|---|
| ASP를 사용합니다.jquery ajax를 사용한 NET MVC 검증 (0) | 2023.03.10 |
| 각도에서는 페이지 변경과 같은 사용자 이벤트에서 $interval을 취소하려면 어떻게 해야 합니까? (0) | 2023.03.10 |
| Next.js 글로벌 CSS는 커스텀 이외의 파일에서 Import할 수 없습니다. (0) | 2023.03.10 |
| spring boot web-client에서 콘텐츠타입 어플리케이션/x-www-form-urlencoded 폼 데이터 요청을 게시하는 방법 (0) | 2023.03.10 |