컨트롤러에서 예외 처리를 수행하고 있습니다. : create 작업에서 예외가 발생하면 : new 작업으로 렌더링하고 플래시 메시지를 표시합니다.
모든 것이 잘 작동하고 예외가 발생하면 플래시 메시지를 볼 수 있지만 다른 페이지로 리디렉션 (손으로 클릭) 하면 플래시 메시지가 여전히 여기에 있습니다 . 그런 다음 다른 페이지 ( 두 번째 클릭)로 리디렉션 하면 메시지가 사라질 수 있습니다.
이유가 무엇인지 아는 사람?
내 컨트롤러 코드 :
class MessagesController < ApplicationController
rescue_from Exception, :with => :render_new
def new
end
def create
end
private
def render_new
flash[:alert] = t("uploading_error")
render :action => :new
end
end
내 레이아웃 코드 (Haml) :
%body
#content
- unless flash[:alert].blank?
#alert= flash[:alert]
답변
바꾸다
flash[:alert] = t("uploading_error")
와
flash.now.alert = t("uploading_error")
그것이 당신이 기대하는 결과인지 확인하십시오.
flash[:alert]
다음 페이지를 위해 머물 것입니다 (따라서 두 번째 리디렉션에서만 사라집니다). 그러나 flash.now.alert
현재 페이지에 대해서만 표시됩니다.
답변
flash.now와 일반 플래시 중 하나를 결정하는 것은 당장 고통스럽고 내 경험상 매우 취약합니다. 나는 일반 플래시를 사용하고 플래시를 표시하는 부분을 수정하여 사용자가 본 후 각 플래시의 내용을 삭제합니다. 나는 이것이 더 낫다고 생각한다.
a) 그것에 대해 생각할 필요가 없습니다
b) “사용자가 본 적이 있습니까?” (예 : “플래시가 부분적으로 렌더링 되었습니까?”) 앱의 로직보다는 플래시를 지 울지 여부를 결정하는 가장 좋은 기준입니다.
내 플래시 부분은 다음과 같습니다. 또한 플래시를 강조 표시하기 위해 약간의 jquery를 사용합니다 (즉, 잠시 동안 노란색으로 깜박임).
<div id="flashes">
<% if flash[:notice] %>
<p id="flash_notice" class="messages notice"><%= flash[:notice] %></p>
<%= javascript_tag "$('#flash_notice').effect('highlight',{},1000);" %>
<% end %>
<% if flash[:error] || flash[:errors] %>
<p id="flash_errors" class="messages errors"><%= flash[:error] || flash[:errors] %></p>
<%= javascript_tag "$('#flash_errors').effect('highlight',{},1000);" %>
<% end %>
<% flash[:error] = flash[:errors] = flash[:notice] = nil %>
</div>
답변
대안은 다음과 같이 부분 끝에 flash.clear 를 사용하는 것입니다 .
<% if !flash.empty? %>
<div class="flash-messages-container">
<% flash.each do |name, msg| %>
<% if msg.is_a?(String) && [:success, :info, :error, :warning].include?(name) %>
<div class="flash-message" data-type="<%= name %>" >
<%= msg %>
</div>
<% end %>
<% end %>
</div>
<% flash.clear %>
<% end %>
답변
또한 flash
표시 할 때 내부 해시 를 지우는 것이 좋습니다 .
flash.clear
깔끔한 방식으로 트릭을 수행합니다.
<% flash.each do |key, value| %>
<div class="alert alert-<%= key %>">
<%= value %>
</div>
<% end %>
<% flash.clear %> #this line clears the object
http://api.rubyonrails.org/classes/ActionDispatch/Flash/FlashHash.html#method-i-clear
답변
이것이 작동하지 않더라도 … 구문 오류와 같은 특정 유형의 예외는 … 모든 유형의 쿠키, 플래시 또는 매개 변수가 컨트롤러에서보기로 전송되는 것을 방지합니다. 유일한 옵션은 세션 키를 사용한 다음 오류를 표시 한 후 지우는 것입니다.
구문 오류로 솔루션을 시도하십시오 … 세션 키를 제외하고는 리디렉션 된 페이지에 메시지가 표시되지 않습니다 …..
답변
이전에는 같은 문제가 있었지만 이제는 이것을 통해 해결 되었습니다. 코드에서 이것을 시도하십시오 .
<script type="text/javascript">
$(document).ready(function(){
setTimeout(function(){
$('#flash').fadeOut();
}, 2000);
})
</script>