Mam stronę z listą wszystkich projektów z sortowalnymi nagłówkami i stronicowaniem.
path:
/projects?order=asc&page=3&sort=code
Wybieram edycję jednego z projektów
path:
projects/436/edit
Po kliknięciu opcji Zapisz na tej stronie wywołuje metodę kontrolera / aktualizacji projektów. Po zaktualizowaniu kodu chcę przekierować do ścieżki, na której byłem, zanim kliknąłem edytować konkretny projekt. Innymi słowy, chcę być na tej samej stronie z tym samym sortowaniem.
Widziałem link_to (: back) i pomyślałem, że: back może działać w redirect_to (: back), ale to nie jest wyjście.
puts YAML::dump(:back)
yields the following:
:back
Wszelkie pomysły na to, w jaki sposób mogę to uruchomić. Wygląda na to, że problem można łatwo rozwiązać, ale jestem nowy w RoR.
źródło
redirect_to session.delete(:return_to)
w akcji aktualizacji. Czyści to wartość z sesji, ponieważ nie jest już potrzebna.redirect_to request.referer
?request.referer.referer
, jeśli to możliwe. @Jaime Bellmyer Dlaczego||=
?Dlaczego
redirect_to(:back)
dla ciebie nie działa, dlaczego nie można go przejść?redirect_to(:back)
działa jak urok dla mnie. To tylko skrót doredirect_to(request.env['HTTP_REFERER'])
http://apidock.com/rails/ActionController/Base/redirect_to (wcześniej Rails 3) lub http://apidock.com/rails/ActionController/Redirecting/redirect_to (Rails 3)
Pamiętaj, że
redirect_to(:back)
jest on przestarzały w Rails 5. Możesz użyćredirect_back(fallback_location: 'something')
zamiast tego (patrz http://blog.bigbinary.com/2016/02/29/rails-5-improves-redirect_to_back-with-redirect-back.html )źródło
redirect_to :back
też nie działa dla mnie dobrze, powiedzmy, że odwiedzasz/posts/new
, jest to ustawione jako odsyłacz do następnego żądania, więc po pomyślnym przesłaniu formularza pokazuje formularz ponownie, tj/posts/new
. Działa jednak dobrze do innych celów.redirect_to projects_path
.HTTP_REFERER
nie jest ustawiony, możesz dostaćActionController::RedirectBackError
, będziesz musiał uratować od tego wyjątku w takim przypadku. Z mojego zrozumienia, używanieredirect_back
nie wymaga obsługi wyjątków, ponieważ jesteś zmuszony to zapewnićfallback_location
. Może „nie działa dobrze” nie jest właściwym sposobem na wyrażenie tego.Podoba mi się metoda Jaime'a z jednym wyjątkiem. Lepiej działało dla mnie ponowne przechowywanie odsyłacza za każdym razem:
Powodem jest to, że jeśli edytujesz wiele obiektów, zawsze zostaniesz przekierowany z powrotem do pierwszego adresu URL zapisanego w sesji metodą Jaime. Załóżmy na przykład, że mam obiekty Apple i Orange. Ja edytuję Apple i
session[:return_to]
ustawiam na osobę polecającą tę akcję. Kiedy przejdę do edycji pomarańczy przy użyciu tego samego kodu,session[:return_to]
nie zostanie ustawiony, ponieważ jest już zdefiniowany. Więc kiedy zaktualizuję Orange, zostanę wysłany do strony odsyłającej z poprzedniej akcji edycji # Apple.źródło
Tak to robimy w naszej aplikacji
W ten sposób przechowujesz tylko ostatnie żądanie GET w
:return_to
parametrze sesji, więc wszystkie formularze, nawet jeśli wielokrotne testowanie POST działałoby:return_to
.źródło
request.request_uri
nie jest już dostępny, więc sugeruję użyćrequest.fullpath
zamiast tegoand
ior
wif
sprawozdaniu. Użyj&&
i||
zamiast. Szczegóły tutaj .W szynach 5, zgodnie z instrukcjami w Przewodnikach po szynach, możesz użyć:
Lokalizacja „wstecz” jest pobierana z nagłówka HTTP_REFERER, co nie jest gwarantowane przez przeglądarkę. Właśnie dlatego powinieneś podać „fallback_location”.
źródło
notice
obiekt zredirect_back
instrukcją, aby poinformować użytkownika, że coś poszło nie tak z komunikatem flash?redirect_back(fallback_location: root_path, notice: "Something went wrong!")
. Mam nadzieję, że to może jakoś pomóc.request.referer
jest ustawiony przez Rack i jest ustawiony następująco:Po prostu zrób a,
redirect_to request.referer
a zawsze przekieruje na prawdziwą stronę odsyłającą lub ścieżkę root_path ('/'). Jest to niezbędne przy zdawaniu testów, które kończą się niepowodzeniem w przypadku bezpośredniego przejścia do konkretnej strony, na której kontroler rzuca przekierowanie_do: wsteczźródło
referer
zostało zdefiniowane na 28 marca 2011 r. I tak jest zdefiniowane na dzień dzisiejszy . Oznacza to, że|| '/'
nie jest częścią definicji.Dla tych, którzy są zainteresowani, oto moja implementacja rozszerzająca oryginalną odpowiedź MBO (napisaną przeciwko szynom 4.2.4, ruby 2.1.5).
źródło