97 votes

Effectuer correctement redirect_to: back dans Ruby on Rails lorsque le référent n'est pas disponible

J'ai un problème avec redirect_to :back . Oui, ce sont des référents.

Je reçois souvent l'exception (ActionController::RedirectBackError) "No HTTP_REFERER was set in the request to this action, so redirect_to :back could not be called successfully. If this is a test, make sure to specify request.env[\"HTTP_REFERER\"]."

Je me rends compte que cela résulte du fait qu'un référent n'est pas disponible. Existe-t-il un moyen, par exemple, de définir une variable de session sur chaque accès avec la dernière page visitée et, lorsque HTTP_REFERER n'est pas disponible, d'utiliser cette variable de session vers laquelle se rediriger?

Merci!

148voto

harm Points 1835

Il est peu probable que vous avez une session et n'ont pas referrer.

La situation dans laquelle un référent n'est pas défini n'est pas si rare et je sauve généralement cette expection:

 def some_method
  redirect_to :back
rescue ActionController::RedirectBackError
  redirect_to root_path
end
 

Si vous le faites souvent (ce qui, à mon avis, est une mauvaise idée), vous pouvez l’envelopper dans une autre méthode, comme le suggère Maran.

BTW, je pense que c'est une mauvaise idée car cela rend le flux d'utilisateurs ambigu. Ce n'est que dans le cas d'une connexion est raisonnable.

39voto

Mirko Points 2719

Voici ma petite méthode redirect_to_back:

   def redirect_to_back(default = root_url)
    if !request.env["HTTP_REFERER"].blank? and request.env["HTTP_REFERER"] != request.env["REQUEST_URI"]
      redirect_to :back
    else
      redirect_to default
    end
  end
 

Vous pouvez passer une URL optionnelle pour aller ailleurs si http_refferrer est vide.

38voto

Maran Points 2283
 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
 

Essayez ça! (Merci au plugin Authlogic )

21voto

troex Points 583

Peut-être qu'il est tard mais je voudrais partager ma méthode qui préserve également des options:

   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
 

Vous pouvez l'utiliser comme:

 redirect_back_or_default(some_path, :notice => 'Hello from redirect', :status => 301)
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X