Jak przekierować do poprzedniej strony w Ruby On Rails?
Mam stronę, która zawiera listę wszystkich projektów, które mają sortowalne nagłówki i paginację.
path:
/projects?order=asc&page=3&sort=code
Wybieram edytowanie jednego z projektów
path:
projects/436/edit
Kiedy klikam Zapisz na tej stronie, wywołuje kontroler projektów / metodę aktualizacji. Po zaktualizowaniu kodu chcę przekierować do ścieżki, na której byłem przed kliknięciem edytuj konkretny projekt. Innymi słowy, chcę być na tej samej stronie z tym samym sortowaniem.
Zobaczyłem link_to (: back) i pomyślałem, że : back może działać w redirect_to (: back), ale to nie działa.
puts YAML::dump(:back)
yields the following:
:back
Jakieś pomysły, jak to uruchomić. Wydaje się, że problem, który można łatwo rozwiązać, ale jestem nowy w RoR. 7 answers
W akcji edycji Zapisz żądający adres url w hashu sesji, który jest dostępny dla wielu żądań:
session[:return_to] ||= request.referer
Następnie Przekieruj do niego w akcji aktualizacji, po pomyślnym zapisaniu:
redirect_to session.delete(:return_to)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-09 13:57:54
Dlaczego redirect_to(:back)
nie działa dla ciebie, dlaczego to nie działa?
redirect_to(:back)
działa jak urok dla mnie. To tylko skrót dla
redirect_to(request.env['HTTP_REFERER'])
Http://apidock.com/rails/ActionController/Base/redirect_to (pre Rails 3) lub http://apidock.com/rails/ActionController/Redirecting/redirect_to (Rails 3)
Należy pamiętać, że redirect_to(:back)
jest przestarzały w Rails 5. Możesz użyć
redirect_back(fallback_location: 'something')
zamiast (zobacz http://blog.bigbinary.com/2016/02/29/rails-5-improves-redirect_to_back-with-redirect-back.html)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-21 08:13:59
Podoba mi się metoda Jaime ' a z jednym wyjątkiem, lepiej mi było za każdym razem ponownie przechowywać referer:
def edit
session[:return_to] = request.referer
...
Powodem jest to, że jeśli edytujesz wiele obiektów, zawsze zostaniesz przekierowany z powrotem do pierwszego adresu URL zapisanego w sesji za pomocą metody Jaime. Na przykład, powiedzmy, że mam przedmioty Apple i Orange. Edytuję Apple i session[:return_to]
zostaje ustawiony na referer tej akcji. Kiedy przechodzę do edycji pomarańczy używając tego samego kodu, session[:return_to]
nie zostanie ustawiony, ponieważ jest już zdefiniowany. Więc kiedy zaktualizuję Orange, zostanę wysłany do referera poprzedniej akcji Apple#edit.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-06-27 17:05:53
Tak to robimy w naszej aplikacji
def store_location
session[:return_to] = request.fullpath if request.get? and controller_name != "user_sessions" and controller_name != "sessions"
end
def redirect_back_or_default(default)
redirect_to(session[:return_to] || default)
end
W ten sposób przechowujesz tylko ostatnie żądanie GET w :return_to
session param, więc wszystkie formularze, nawet jeśli są wysyłane wielokrotnie, będą działać z :return_to
.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-12-21 19:11:27
W rails 5, zgodnie z instrukcjami w prowadnicach Rails, możesz użyć:
redirect_back(fallback_location: root_path)
Lokalizacja "wstecz"jest pobierana z nagłówka HTTP_REFERER, który nie jest gwarantowany przez przeglądarkę. Dlatego powinieneś podać 'fallback_location'.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-04 06:59:10
request.referer
jest ustawiona przez Rack i jest ustawiona w następujący sposób:
def referer
@env['HTTP_REFERER'] || '/'
end
Po prostu wykonaj redirect_to request.referer
i zawsze przekieruje do prawdziwej strony odsyłającej lub ścieżki root_path ('/'). Jest to niezbędne podczas przechodzenia testów, które nie powiodą się w przypadku direct-nav do konkretnej strony, w której kontroler wyrzuca redirect_to: back
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-03-25 14:51:58
Dla zainteresowanych, oto moja implementacja rozszerzająca oryginalną odpowiedź MBO (napisaną na tle rails 4.2.4, ruby 2.1.5).
class ApplicationController < ActionController::Base
after_filter :set_return_to_location
REDIRECT_CONTROLLER_BLACKLIST = %w(
sessions
user_sessions
...
etc.
)
...
def set_return_to_location
return unless request.get?
return unless request.format.html?
return unless %w(show index edit).include?(params[:action])
return if REDIRECT_CONTROLLER_BLACKLIST.include?(controller_name)
session[:return_to] = request.fullpath
end
def redirect_back_or_default(default_path = root_path)
redirect_to(
session[:return_to].present? && session[:return_to] != request.fullpath ?
session[:return_to] : default_path
)
end
end
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-08 19:03:10