Come redirect alla pagina precedente in Ruby On Rails?

Ho una pagina che elenca tutti i progetti che hanno intestazioni e paginazione ordinabili.

path: /projects?order=asc&page=3&sort=code 

Ho scelto di modificare uno dei progetti

 path: projects/436/edit 

Quando faccio clic su Salva su quella pagina, chiama il metodo di controllo / aggiornamento dei progetti. Dopo aver aggiornato il codice, desidero redirect al percorso in cui ero prima di fare clic su modifica di un progetto specifico. In altre parole, voglio essere sulla stessa pagina con lo stesso ordinamento.

Ho visto link_to (: back) e ho pensato che: back potrebbe funzionare in redirect_to (: back), ma questo è un no go.

 puts YAML::dump(:back) yields the following: :back 

Qualche idea su come potrei farlo funzionare. Sembra un problema che potrebbe essere risolto facilmente, ma sono nuovo di RoR.

Nell’azione di modifica, archiviare l’URL di richiesta nell’hash della sessione, che è disponibile su più richieste:

 session[:return_to] ||= request.referer 

Quindi reindirizza ad esso nella tua azione di aggiornamento, dopo un salvataggio riuscito:

 redirect_to session.delete(:return_to) 

Perché redirect_to(:back) non funziona per te, perché è un no go?

redirect_to(:back) funziona come un incantesimo per me. È solo una scorciatoia per redirect_to(request.env['HTTP_REFERER'])

http://apidock.com/rails/ActionController/Base/redirect_to (pre Rails 3) o http://apidock.com/rails/ActionController/Redirecting/redirect_to (Rails 3)

Si noti che redirect_to(:back) viene deprecato in Rails 5. È ansible utilizzare

redirect_back(fallback_location: 'something') invece (vedi http://blog.bigbinary.com/2016/02/29/rails-5-improves-redirect_to_back-with-redirect-back.html )

Mi piace il metodo di Jaime con un’eccezione, ha funzionato meglio per me per ri-memorizzare il referer ogni volta:

 def edit session[:return_to] = request.referer ... 

Il motivo è che se modifichi più oggetti, sarai sempre reindirizzato al primo URL che hai archiviato nella sessione con il metodo di Jaime. Ad esempio, supponiamo di avere oggetti Apple e Orange. Io modifico Apple e la session[:return_to] viene impostata sul referer di quell’azione. Quando vado a modificare Arance usando lo stesso codice, la session[:return_to] non verrà impostata perché è già definita. Così, quando aggiorno Orange, verrò inviato al referente della precedente azione di modifica di # Apple.

Questo è come lo facciamo nella nostra applicazione

 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 

In questo modo puoi archiviare solo l’ultima richiesta GET in :return_to sessione param, quindi tutti i form, anche quando più post POST funzionerà con :return_to .

request.referer è impostato da Rack ed è impostato come segue:

 def referer @env['HTTP_REFERER'] || '/' end 

Basta fare un redirect_to request.referer e verrà sempre reindirizzato alla pagina di riferimento vera o root_path (‘/’). Questo è essenziale quando si superano i test che falliscono nei casi di direct-nav verso una particolare pagina in cui il controllore lancia un redirect_to: back

Nelle guide 5, come da istruzioni in Guide Rails, puoi utilizzare:

 redirect_back(fallback_location: root_path) 

La posizione “indietro” viene estratta dall’intestazione HTTP_REFERER che non è garantita per essere impostata dal browser. Ecco perché dovresti fornire un ‘fallback_location’.

Per coloro che sono interessati, ecco la mia implementazione estendendo la risposta originale di MBO (scritta contro rail 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