Как повторно отправить форму с запросом POST после обращения к сеансу с истекшим временем ожидания? - PullRequest
3 голосов
/ 24 февраля 2012

Дайте мне посмотреть, смогу ли я это объяснить.

У меня есть before_filter :require_user во всех моих контроллерах.

В моем ApplicationController у меня есть следующий метод

def require_user
  unless current_user #Redirect to login page if no user currently logged in
    flash[:notice] = "You must be logged in to access this page"
    redirect_to login_path
  end
  if current_user.timed_out? #Redirect to login page if user's session timed out and set session[:return_to]
    session[:user_id] = nil
    session[:return_to] = request.request_uri
    flash[:notice] = "Your session has timed out, please log back in"
    redirect_to login_path and return
  end
  current_user.update_last_request_at #Otherwise user is logged in. Update last request time in user model
end

Затем я использую следующий метод в моем SessionsController, чтобы перенаправить обратно на страницу, которую хотел пользователь, если он снова регистрировался через некоторое время.

def redirect_back_or_default
  session[:return_to] ? redirect_to(session[:return_to]) : redirect_to(root_path)
  session[:return_to] = nil
end

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

Проблема, с которой я столкнулся, заключается в том, что пользователь вызывает форму, а затем время ожидания сеанса перед отправкой.Когда они отправляют его, в приложение отправляется запрос POST, и before_filter перехватывает данные и требует от них повторного входа в систему. В этот момент все идет не так, как запрос GET отправляется redirect_to(session[:return_to]).Есть ли способ захвата метода запроса (и в идеале параметров формы), чтобы их можно было переслать в сеансе?

1 Ответ

0 голосов
/ 13 февраля 2015

Чтобы ответить на ваш вопрос, вы можете сделать это, но это болезненно.

session[:return_to] = {controller: params[:controller], action: params[:action], id: params[:id]}
session[:return_to_params] = parameters.inspect

Затем снова использовать их

eval(session[:return_to_params])

Затем перенаправить и переиздать

redirect_to(params[:return_to].merge(eval(session[:return_to_params]))) 

Вы можете сделать это настолько сложным, насколько захотите, сохранив его в БД, в сеансе, записав в файл и т. Д.


Я бы рекомендовалальтернатива

Сначала измените ваше представление на ajax-запрос.Если вы беспокоитесь о том, что ваша форма не перенаправляет после создания, просто попросите ваш метод create ответить с помощью javascript:

window.location = "<%= destination %>"

Затем измените ваш require_user так, чтобы он был похож на этот:установить это на рельсах 2.3, но его достаточно легко перевести.

Обычно, если они отправляют запрос ajax и выходят из системы, вы отвечаете javascript, который создает наложение с экраном входа в систему.Если они успешно вошли в систему, вы удалите оверлей и сможете снова нажать кнопку «Отправить» (или вы отправляете его самостоятельно с помощью JavaScript, если это то, что вы ищете).

...