как ответить на вызов ajax в before_filter - PullRequest
7 голосов
/ 28 марта 2012

Я пишу before_filter так:

def authenticate_user
  if request.xhr?
    flash.now[:alert] = 'Error'
    render :partial => "js_helpers/popover", :formats => :js
  else
    authenticate_user!
  end
end

Однако, это не работает, как ожидалось. Файл журнала показывает:

  Rendered js_helpers/_popover.js.erb (0.1ms)
Filter chain halted as :authenticate_user rendered or redirected

Функция кода js состоит в отображении всплывающего блока, показывающего флэш-сообщение. но похоже, что js-код вообще не возбужден.

Итак, я изменил свой путь:

def authenticate_user
  if request.xhr?
    flash.now[:alert] = 'Error'
    render :js => "window.location = '/users/sign_up'"
  else
    authenticate_user!
  end
end

Вместо этого я хочу перенаправить на страницу регистрации.

Однако проблемы все еще существуют. вспышка не работает

Как мне достичь своей цели:

когда запрос является ajax-вызовом, выполните код come javascript или перенаправьте на новую страницу. В обоих случаях мне нужно хранить некоторые сообщения во флэш-памяти.

Плюс, код javascript очень длинный, поэтому мне нужно поместить его в файл. Как я могу использовать render: js для выполнения JavaScript внутри файла?

Ответы [ 2 ]

2 голосов
/ 01 июня 2013

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

def authenticate_user
  if request.xhr?
    render :json => { alert: 'Error', redirect: sign_up_path }, :status => 403
  else
    authenticate_user!
  end
end

В ваших вызовах ajax перехватите код состояния 403, отобразите предупреждающее сообщение и перенаправьте на указанный URL-адрес. Вы должны иметь возможность сделать это стандартным хуком для 403 (или любого другого кода состояния, который кажется наиболее подходящим), чтобы он мог быть таким же СУХИМЫМ, как before_filter.

0 голосов
/ 11 мая 2015

Я думаю, что использование встроенного перенаправления rails - это то, что вы ищете.

def authenticate_user
  if request.xhr?
    flash[:alert] = 'Error'
    redirect_to user_sign_up
  else
   authenticate_user!
  end
end

Это должно перенаправить и заполнить флэш-сообщение

Вот пример из направляющих рельсов

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