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.
Author: Lucio, 2010-01-26

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)
 328
Author: Jaime Bellmyer,
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)

 102
Author: Pascal,
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.

 45
Author: Tony,
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.

 33
Author: MBO,
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'.

 20
Author: pSkarl,
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

 18
Author: Steve Tipton,
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
 1
Author: aschyiel,
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