Правильно выполните 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
, сделайте это в другой части кода.