Мои флеш-оповещения иногда исчезают, но не все время - PullRequest
1 голос
/ 06 марта 2019

Мои флеш-сообщения иногда исчезают, как и ожидалось, а иногда нет.

Вот пример работы флэш-сообщения (контроллер)

  def create
    user = User.find_by_email(params[:email])
    if user && user.authenticate(params[:password])
      session[:user_id] = user.id
      redirect_to root_url, alert: "Logged in!"
    else
      flash.now[:alert] = "Email or password is invalid"
      render "new"
    end
  end

Вот пример не исчезающего флэш-предупреждения

  def destroy
    session[:user_id] = nil
    redirect_to root_url, alert: "Logged out!"
  end

Вот функция jQuery

jQuery(document).ready(function(){
  setTimeout(function(){
    $('#notice_wrapper').fadeOut("slow", function() {
      $(this).remove();
    })
  }, 3500);
});

Вот html / css / erb для оболочки

<% if notice %>
    <div id="notice_wrapper" style="position: absolute; top: 0; width: 100%; z-index: 999; background: rgba(135, 216, 211, 0.85);">
      <p class="notice"><%= notice %></p>
    </div>  
  <% elsif alert%>
    <div id="notice_wrapper" style="padding: 2.5rem 0; text-align: center; margin: 0; font-size: 1.25rem; font-weight: 700; color: white; letter-spacing: 1px;">
      <p class="alert"><%= alert %></p>
    </div>
<% end %>

Почему это работает для первого примера, а не для второго.

1 Ответ

1 голос
/ 08 марта 2019

Я предполагаю, что в вашем application_controller включен protect_from_forgery.

У меня была похожая проблема, когда вспышка работала нормально на #create и #update, но не на #destroy.Это было связано с protect_from_forgery, который очищает flash_hash, если запрос не проверен, как, например, при отсутствии отсутствующего токена в запросе не GET.

Вы можете решить эту проблему двумя способами:

  1. Отправив запрос на удаление через форму, чтобы Rails вставил правильный токен.Моя ошибка заключалась в использовании тега link_to, который генерирует <a> вместо тега button_to, который генерирует форму.
  2. Добавление условия к protect_from_forgery, чтобы он не очищал flash_hash, например protect_from_forgery with: :null_session, if: Proc.new { |c| c.request.format == 'application/json' }.Я видел это решение здесь .

Я нашел эту статью , которая будет полезна для получения дополнительной информации о protect_from_forgery.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...