플래시 메시지가 사라지지 않는 이유는 무엇입니까?


79

컨트롤러에서 예외 처리를 수행하고 있습니다. : 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]

답변:


163

바꾸다

flash[:alert] = t("uploading_error")

flash.now.alert = t("uploading_error")

그것이 당신이 기대하는 결과인지 확인하십시오.

flash[:alert]다음 페이지를 위해 머물 것입니다 (따라서 두 번째 리디렉션에서만 사라집니다). 그러나 flash.now.alert현재 페이지에 대해서만 표시됩니다.


탁월한 솔루션과 링크! zabba 감사합니다!
Jimmy Huang 2011 년

1
이제 flash와 flash.now에 대해 더 많이 알고 있습니다. 따라서 렌더링 대신 redirect_to를 사용하면 플래시를 사용하는 것도 문제가되지 않습니다.
Jimmy Huang 2011 년

1
참고 : 링크가 끊어졌습니다. 그러나 링크를 보지 않고도 flash.now [: alert]가 기본값이 아닌 이유가 궁금하다는 점을 인정해야합니다.
여행

현재 귀하의 사이트에 액세스 할 수 없습니다. : P
Rafaiel

1
레일 문서는 또한 몇 가지 괜찮은 가지고 플래시 및 flash.now에 대한 정보
Zabba

45

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>

멍청한 질문 일 수도 있지만 이렇게하면 렌더링 될 다른 플래시가 삭제 될 수 있습니까?
Bradford

@Bradford-나는 그렇게 생각하지 않는다 : 나는 단지 내가 렌더링 한 세 개의 플래시 키를 지운다. 렌더링되지 않고 지워지는 방법은 없으며 지워지는 부분이 동일한 부분에서 발생하기 때문에 렌더링되고 지워지는 사이에는 아무 일도 일어나지 않습니다.
Max Williams

게임이 늦었지만 나는 이것을 좋아합니다.
Dan Barron

1
나는 이것을 시도했다. 값을 nil로 설정해도 플래시에서 키가 제거되지 않기 때문에 flash.discard (a_single_key)가 더 좋습니다. 결과적으로 삭제 된 키에 대해 빈 메시지가 표시 될 수 있습니다.
TrongBang

34

대안은 다음과 같이 부분 끝에 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.clear는보다 깨끗 <% 플래시 [오류 = 플래시 [: 에러 = 플래시 [: 고지] = 닐 %>
케빈 Zych

내 경험상 플래시 메시지가 지속될 필요가없는 한 이것이 최선의 방법입니다. 왜 템플릿 (스캐 폴드가할까요?)에 flash.clear가 기본적으로 제공되지 않는 이유를 모르겠습니다.
Ravenstine 2015 년

2
flash.clear는 나를 위해 작동하지 않습니다. 플래시가 여전히 사라지지 않습니다
Nimish


1

이것이 작동하지 않더라도 ... 구문 오류와 같은 특정 유형의 예외는 ... 모든 유형의 쿠키, 플래시 또는 매개 변수가 컨트롤러에서보기로 전송되는 것을 방지합니다. 유일한 옵션은 세션 키를 사용한 다음 오류를 표시 한 후 지우는 것입니다.

구문 오류로 솔루션을 시도하십시오 ... 세션 키를 제외하고는 리디렉션 된 페이지에 메시지가 표시되지 않습니다 .....


1

이전에는 같은 문제가 있었지만 이제는 이것을 통해 해결 되었습니다. 코드에서 이것을 시도하십시오 .

<script type="text/javascript">
  $(document).ready(function(){
    setTimeout(function(){
    $('#flash').fadeOut();
    }, 2000);
  })
</script>
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.