Правильно выполните redirect_to: назад в Ruby on Rails, когда реферер недоступен

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

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

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

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

Ответ 1

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

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

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

Ответ 2

Здесь мой маленький метод 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 пуст.

Ответ 3

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

Ответ 4

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

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

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

EDIT: источник

Ответ 5

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

  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)

Ответ 6

похож на @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')}

Ответ 7

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


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

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