62 votos

Correctamente haciendo redirect_to :de nuevo en Ruby on Rails, cuando la referencia es de no disponible

Estoy teniendo un problema con redirect_to :back. Sí, es de referentes.

A menudo tengo la excepción (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\"]."

Me doy cuenta de que esto es un resultado de un remitente que no están disponibles. Hay una manera que, por ejemplo, se puede establecer una variable de sesión en cada acceso con la última página visitada, y, cuando HTTP_REFERER no está disponible, utilizar esta variable de sesión para redirigir a?

Gracias!

105voto

harm Puntos 1835

Es poco probable que hacer una sesión y no tienen un referente.

La situación en la que una referencia es de no set no es poco comunes y generalmente de rescate que expection:

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

Si usted hace esto a menudo (que creo que es una mala idea) se puede envolver en un otro método como Maran sugiere.

Por CIERTO, creo que es una mala idea, porque esto hace que el userflow ambigua. Sólo en el caso de un inicio de sesión es este sensato.

33voto

Maran Puntos 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

Trate de eso! (Gracias a la Authlogic plugin)

27voto

Mirko Puntos 2719

Aquí está mi pequeño redirect_to_back método:

  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

Usted puede pasar una url opcional a ir a otro lugar si http_refferrer está en blanco.

20voto

troex Puntos 583

Tal vez sea tarde, pero me gustaría compartir mi método que también preservar opciones:

  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

Se puede utilizar como:

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

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X