Вспышка появляется при обновлении - PullRequest
0 голосов
/ 20 октября 2010

Я показываю флеш-сообщения в моем приложении rails, используя javascript (по сути, каждое флеш-сообщение - это оверлейный div).

Следующий фрагмент включен в мой основной файл макета и заботится об отображении флеш-памяти.Я замечаю, что если я обновляю страницу, снова появляется одно и то же флэш-сообщение.В любом случае, чтобы избавиться от этого?Я знаю, что могу вызвать flash.discard, но не уверен, что это лучшее место для этого, и я не хочу, чтобы другой вызов контроллера просто сбрасывал флэш.

<% if !flash.nil? %>
  <% if flash[:notice] %>
  <script type="text/javascript">
      //<![CDATA[
      showFlash("<%= flash[:notice] %>", "flash-notice");
      //]]>
    </script>
  <% end  %>
  <% if flash[:success] %>
  <script type="text/javascript">
      //<![CDATA[
      showFlash("<%= flash[:success] %>", "flash-success");
      //]]>
    </script>

  <% end  %>
  <% if flash[:error] %>
  <script type="text/javascript">
      //<![CDATA[
      showFlash("<%= flash[:error] %>", "flash-error");
      //]]>
    </script>
  <% end  %>
<% end  %>


function showFlash(msg, tp) {
    if ($('#flash_messages_container').length > 0) {
        flashAnimatedHide();
    }

    var flashContainer = $("<div id='flash_messages_container' class='flash-messages " +  tp  + " '></div>");
    flashContainer.prepend("<div id='flash_messages_content'>" + msg + "<span class='go-right sprite close' id='close_flash'></span></div>");
    $('body').prepend(flashContainer);
    flashContainer.animate({
        opacity : .1
    }, '500', function(){
        flashContainer.css('opacity', 1)
    })
    $('body').css('margin-top', flashContainer.outerHeight());
    $('#close_flash').click(function() {
        flashAnimatedHide();
        $('body').css('margin-top', '0');
    });
}

UPDATE

Я подозреваю, что это происходит, так как я начал использовать etags для кэширования на стороне cient и обратного прокси.Так что я думаю, что обновление - это просто загрузка кэшированной страницы, которая содержит флэш-сообщения во флэш-контейнере.Так как же люди сбрасывают флэш-память, когда включено кэширование?

Ответы [ 3 ]

3 голосов
/ 20 октября 2010

Я тоже сталкивался с дублированными сообщениями вспышек раньше, кажется, что результат похож, но не уверен, что тот же случай.

Используете ли вы flash[:notice] = "something во время действия render :action => "somepage"?

есть.

def some_action
  flash[:notice] = "some notice"
  render :action => "other_action"
end

Тогда вы найдете дубликат flash[:notice] после обновления.

Решением является использование flash.now вместо:

def some_action
  flash.now[:notice] = "some notice"
  render :action => "other_action"
end

и ничего больше не нужно менять.

Пожалуйста, скажите мне, если это не может решить вашу проблему.

0 голосов
/ 13 марта 2011

Решение (rails 3.0.5):

Установите действие вашего контроллера следующим образом:

class MessagesController < ApplicationController
  respond_to :html, :js, :xml, :json

  def create
    @message = Message.create(params[:message])

    flash.now[:notice] = 'This is my message'

    respond_with(@message) do |format|
      format.html { redirect_to '/', :flash => flash }
    end
  end

end

Как вы можете видеть, я передаю переменную: flash при перенаправлении.

0 голосов
/ 20 октября 2010

Хорошо, вот решение, которое я использовал, дайте мне знать, если есть что-нибудь лучше. Это зависит от того, включены ли куки, стоит ли беспокоиться об этом?

<% if !flash.nil? %>
  <% if flash[:notice] %>
    <% cookies[:flash_notice] = flash[:notice] %>
  <% end  %>
  <% if flash[:success] %>
    <% cookies[:flash_success] = flash[:success] %>

  <% end  %>
  <% if flash[:error] %>
    <% cookies[:flash_error] = flash[:error] %>
  <% end  %>
<% end  %>

, а затем используйте JavaScript, чтобы показать флэш-сообщение и удалить куки

function doFlash() {
    if ($.cookie("flash_success") != null) {
        showFlash(removeSpace($.cookie("flash_success")), "flash-success");
        $.cookie("flash_success", null);
    }
    if ($.cookie("flash_notice") != null) {
        showFlash(removeSpace($.cookie("flash_notice")), "flash-notice");
        $.cookie("flash_notice", null);
    }
    if ($.cookie("flash_error") != null) {
        showFlash(removeSpace($.cookie("flash_error")), "flash-error");
        $.cookie("flash_error", null);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...