Правильно делать redirect_to: обратно в Ruby on Rails, когда реферер недоступен - PullRequest
90 голосов
/ 21 апреля 2009

У меня проблема с redirect_to :back. Да, это источники.

Я часто получаю исключение

(ActionController :: RedirectBackError) "В запросе к этому действию не был установлен HTTP_REFERER, поэтому не удалось успешно вызвать redirect_to: back. Если это тест, обязательно укажите request.env [\" HTTP_REFERER \ " ]. "

Я понимаю, что это результат того, что реферер недоступен. Есть ли способ, например, установить переменную сеанса при каждом доступе к последней посещенной странице, и, когда HTTP_REFERER недоступен, использовать эту переменную сеанса для перенаправления на?

Ответы [ 7 ]

140 голосов
/ 21 апреля 2009

Маловероятно, что у вас есть сеанс, а у нет реферера.

Ситуация, когда реферер не установлен, не редкость, и я обычно спасаю это ожидание:

def some_method
  redirect_to :back
rescue ActionController::RedirectBackError
  redirect_to root_path
end

Если вы делаете это часто (что я считаю плохой идеей), вы можете обернуть его другим способом, как предлагает Маран.

Кстати, я думаю, что это плохая идея, потому что это делает поток пользователей неоднозначным. Это разумно только в случае входа в систему.

ОБНОВЛЕНИЕ : Как отметили несколько человек, это больше не работает с Rails 5. Вместо этого используйте redirect_back, этот метод также поддерживает запасной вариант. Код становится:

def some_method
  redirect_back fallback_location: root_path
end
38 голосов
/ 22 января 2011

Вот мой маленький метод redirect_to_back:

  def redirect_to_back(default = root_url)
    if request.env["HTTP_REFERER"].present? and request.env["HTTP_REFERER"] != request.env["REQUEST_URI"]
      redirect_to :back
    else
      redirect_to default
    end
  end

Вы можете передать дополнительный URL-адрес, чтобы перейти в другое место, если http_refferrer пуст.

37 голосов
/ 21 апреля 2009
def store_location
  session[:return_to] = request.request_uri
end

def redirect_back_or_default(default)
  redirect_to(session[:return_to] || default)
  session[:return_to] = nil
end

Попробуй это! (Благодаря плагину Authlogic )

28 голосов
/ 22 марта 2016

Основная функция

redirect_back является основной функцией Rails 5+, она доступна в модуле ActionController::Redirecting, который уже включен в ApplicationController::Base.

ПРЕДУПРЕЖДЕНИЕ О УСТАРЕВАНИИ: redirect_to :back устарело и будет удалено из Rails 5.1. Пожалуйста, используйте redirect_back(fallback_location: fallback_location), где fallback_location представляет местоположение для использования, если в запросе нет информации о HTTP-реферере.

РЕДАКТИРОВАТЬ: источник

21 голосов
/ 22 августа 2012

Возможно, уже поздно, но я хотел бы поделиться своим методом, который также сохраняет параметры:

  def redirect_back_or_default(default = root_path, *options)
    tag_options = {}
    options.first.each { |k,v| tag_options[k] = v } unless options.empty?
    redirect_to (request.referer.present? ? :back : default), tag_options
  end

Вы можете использовать его как:

redirect_back_or_default(some_path, :notice => 'Hello from redirect', :status => 301)
13 голосов
/ 10 августа 2015

аналогично ответу @ troex, добавьте его в свой контроллер приложения

def redirect_back_or_default(default = root_path, options = {})
  redirect_to (request.referer.present? ? :back : default), options
end

затем используйте его в вашем контроллере

redirect_back_or_default answer_path(answer), flash: { error: I18n.t('m.errors')}
0 голосов
/ 16 июня 2016

Недавно я столкнулся с той же проблемой, когда мне приходилось перенаправлять :back или на определенную страницу. Перейдя к большому решению, я, наконец, обнаружил, что это просто и, кажется, решает проблему:

<code>
if request.env["HTTP_REFERER"].present?
    redirect_to :back
else
    redirect_to 'specific/page'
end

Если вы хотите использовать session детали, сделайте это в остальной части кода.

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