Mam problem z redirect_to :back
. Tak, to odsyłacze.
Często mam wyjątek
(ActionController :: RedirectBackError) "Żądanie HTTP_REFERER nie zostało ustawione w żądaniu do tej akcji, więc nie można pomyślnie wywołać redirect_to: back. Jeśli to jest test, upewnij się, że określono request.env [\" HTTP_REFERER \ "]."
Zdaję sobie sprawę, że jest to spowodowane niedostępnością odsyłacza. Czy istnieje sposób, na przykład, aby ustawić zmienną sesji przy każdym dostępie do ostatnio odwiedzonej strony, a gdy HTTP_REFERER nie jest dostępny, użyć tej zmiennej sesji do przekierowania?
ruby-on-rails
ruby
http
user67050
źródło
źródło
Odpowiedzi:
Jest mało prawdopodobne, aby zrobić mieć sesję i nie ma odnośnika zwrotnego.
Sytuacja, w której strona odsyłająca nie jest ustawiona, nie jest rzadkością i zwykle ratuję to oczekiwanie:
def some_method redirect_to :back rescue ActionController::RedirectBackError redirect_to root_path end
Jeśli robisz to często (co moim zdaniem jest złym pomysłem), możesz zastosować inną metodę, jak sugeruje Maran.
BTW Myślę, że to zły pomysł, ponieważ powoduje to niejednoznaczność przepływu użytkowników. Tylko w przypadku logowania jest to sensowne.
AKTUALIZACJA : Jak kilka osób zauważyło, to już nie działa z Railsami 5. Zamiast tego użyj
redirect_back
, ta metoda obsługuje również rezerwę. Kod staje się wtedy:def some_method redirect_back fallback_location: root_path end
źródło
rescue_from
gdyby kontroler miał wieleredirect_to :back
redirect_to (request.referrer || root_url)
Oto moja mała metoda 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
Możesz przekazać opcjonalny adres URL, aby przejść w inne miejsce, jeśli http_refferrer jest puste.
źródło
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
Spróbuj tego! (Dzięki wtyczce Authlogic )
źródło
Podstawowa funkcja
redirect_back
jest podstawową funkcją Rails 5+, jest dostępna wActionController::Redirecting
module, który jest już zawarty wApplicationController::Base
.EDYCJA: źródło
źródło
redirect_to :back
.Może jest już późno, ale chciałbym podzielić się moją metodą, która również zachowuje opcje:
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
Możesz go używać tak jak:
redirect_back_or_default(some_path, :notice => 'Hello from redirect', :status => 301)
źródło
aktualizacja: Rails 5 dodał metodę redirect_back ( https://github.com/rails/rails/pull/22506/ ), lepiej po prostu użyj:
redirect_back fallback_location: answer_path(answer), flash: { error: I18n.t('m.errors')}
W przypadku szyn niższych niż 5.0 można nadal używać starego sposobu poniżej:
podobnie jak odpowiedź @ troex, dodaj to do kontrolera aplikacji
def redirect_back_or_default(default = root_path, options = {}) redirect_to (request.referer.present? ? :back : default), options end
następnie użyj go w kontrolerze
redirect_back_or_default answer_path(answer), flash: { error: I18n.t('m.errors')}
źródło
Niedawno napotkałem ten sam problem, w którym musiałem przekierować
:back
lub przejść do określonej strony. Po przejściu do wielu rozwiązań w końcu znalazłem to, co jest proste i wydaje się, że rozwiązuje problem:if request.env["HTTP_REFERER"].present? redirect_to :back else redirect_to 'specific/page' end
Jeśli chcesz użyć
session
szczegółów, zrób to w dalszej części kodu.źródło