У меня проблема с redirect_to :back
. Да, это рефереры.
Я часто получаю исключение
(ActionController :: RedirectBackError) «В запросе к этому действию не был установлен HTTP_REFERER, поэтому redirect_to: back не может быть успешно вызван. Если это тест, обязательно укажите request.env [\" HTTP_REFERER \ "]."
Я понимаю, что это результат недоступности реферера. Есть ли способ, например, чтобы можно было установить переменную сеанса при каждом доступе с последней посещенной страницей, и, когда HTTP_REFERER недоступен, использовать эту переменную сеанса для перенаправления?
ruby-on-rails
ruby
http
user67050
источник
источник
Ответы:
Это маловероятно , что вы делаете во время сеанса и не имеют реферера.
Ситуация, когда реферер не установлен, не такая уж редкость, и я обычно спасаю это ожидание:
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
источник
rescue_from
если бы у контроллера было несколькоredirect_to :back
redirect_to (request.referrer || root_url)
Вот мой маленький метод 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 пуст.
источник
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 )
источник
Основная функция
redirect_back
это основная функция из Rails 5+, она доступна вActionController::Redirecting
модуле, который уже включен вApplicationController::Base
.РЕДАКТИРОВАТЬ: источник
источник
redirect_to :back
.Возможно, уже поздно, но я хотел бы поделиться своим методом, который также сохраняет параметры:
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)
источник
обновлено: в Rails 5 добавлен метод redirect_back ( https://github.com/rails/rails/pull/22506/ ), лучше просто используйте:
redirect_back fallback_location: answer_path(answer), flash: { error: I18n.t('m.errors')}
Для рельсов ниже 5.0 можно использовать старый способ, указанный ниже:
аналогично ответу @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')}
источник
Недавно я столкнулся с той же проблемой, когда мне приходилось перенаправлять
:back
или на конкретную страницу. После большого количества решений я наконец нашел это, что прост и, кажется, решает проблему:if request.env["HTTP_REFERER"].present? redirect_to :back else redirect_to 'specific/page' end
Если вы хотите использовать
session
детали, сделайте это в другой части кода.источник