J'ai une page qui répertorie tous les projets qui ont des en-têtes et une pagination triables.
path:
/projects?order=asc&page=3&sort=code
J'ai choisi d'éditer l'un des projets
path:
projects/436/edit
Lorsque je clique sur Enregistrer sur cette page, cela appelle la méthode contrôleur / mise à jour des projets. Après avoir mis à jour le code, je souhaite rediriger vers le chemin sur lequel j'étais avant de cliquer sur modifier un projet spécifique. En d'autres termes, je veux être sur la même page avec le même tri.
J'ai vu link_to (: back) et j'ai pensé que: back peut fonctionner dans redirect_to (: back), mais ce n'est pas possible.
puts YAML::dump(:back)
yields the following:
:back
Des idées sur la façon dont je pourrais faire fonctionner cela. Cela semble être un problème qui serait facilement résolu, mais je suis nouveau sur RoR.
la source
redirect_to session.delete(:return_to)
dans l'action de mise à jour. Cela nettoie la valeur de la session, car elle n'est plus nécessaire.redirect_to request.referer
?request.referer.referer
, si cela était possible. @Jaime Bellmyer Pourquoi||=
?Pourquoi ne
redirect_to(:back)
fonctionne pas pour vous, pourquoi est-ce interdit?redirect_to(:back)
fonctionne comme un charme pour moi. C'est juste un raccourci pourredirect_to(request.env['HTTP_REFERER'])
http://apidock.com/rails/ActionController/Base/redirect_to (avant Rails 3) ou http://apidock.com/rails/ActionController/Redirecting/redirect_to (Rails 3)
Veuillez noter que
redirect_to(:back)
c'est obsolète dans Rails 5. Vous pouvez utiliserredirect_back(fallback_location: 'something')
à la place (voir http://blog.bigbinary.com/2016/02/29/rails-5-improves-redirect_to_back-with-redirect-back.html )la source
redirect_to :back
ne fonctionne pas bien pour moi non plus, disons que vous visitez/posts/new
, cela est défini comme référent pour la prochaine demande, donc une fois le formulaire soumis avec succès, il affiche à nouveau le formulaire, c'est-à-dire/posts/new
. Cela fonctionne cependant bien à d'autres fins.redirect_to projects_path
.HTTP_REFERER
n'est pas défini, vous pourriez obtenirActionController::RedirectBackError
, vous devrez vous sauver de cette exception dans ce cas. D'après ce que je comprends, l'utilisationredirect_back
ne nécessite aucune gestion des exceptions puisque vous êtes obligé de fournirfallback_location
. Peut-être que «ne fonctionne pas bien» n'est pas la bonne façon de le dire.J'aime la méthode de Jaime à une exception près, cela fonctionnait mieux pour moi de re-stocker le référent à chaque fois:
La raison en est que si vous modifiez plusieurs objets, vous serez toujours redirigé vers la première URL que vous avez stockée dans la session avec la méthode de Jaime. Par exemple, disons que j'ai des objets Apple et Orange. J'édite Apple et je suis
session[:return_to]
défini sur le référent de cette action. Lorsque je vais modifier les oranges en utilisant le même code,session[:return_to]
ne sera pas défini car il est déjà défini. Ainsi, lorsque je mettrai à jour l'Orange, je serai envoyé au référent de la précédente action d'édition Apple #.la source
Voici comment nous procédons dans notre application
De cette façon, vous ne stockez que la dernière requête GET dans le
:return_to
paramètre de session, de sorte que tous les formulaires, même lorsque plusieurs fois POSTed fonctionneraient:return_to
.la source
request.request_uri
n'est plus disponible, donc je suggère d'utiliser à larequest.fullpath
placeand
etor
dans lesif
déclarations. Utilisez&&
et à la||
place. Détails ici .Dans les rails 5, conformément aux instructions des guides de rails, vous pouvez utiliser:
L'emplacement «back» est extrait de l'en-tête HTTP_REFERER qui n'est pas garanti d'être défini par le navigateur. C'est pourquoi vous devriez fournir un 'fallback_location'.
la source
notice
objet avec l'redirect_back
instruction afin de dire à l'utilisateur que quelque chose s'est mal passé avec un message flash?redirect_back(fallback_location: root_path, notice: "Something went wrong!")
. J'espère que cela pourrait aider d'une manière ou d'une autre.request.referer
est défini par Rack et est défini comme suit:Faites simplement un
redirect_to request.referer
et il sera toujours redirigé vers la vraie page de référence, ou le root_path ('/'). Ceci est essentiel lors de la réussite des tests qui échouent en cas de navigation directe vers une page particulière dans laquelle le contrôleur jette un redirect_to: backla source
referer
été défini au 28 mars 2011 , et c'est ainsi qu'il est défini aujourd'hui . Autrement dit,|| '/'
ne fait pas partie de la définition.Pour ceux qui sont intéressés, voici mon implémentation étendant la réponse originale de MBO (écrite contre les rails 4.2.4, ruby 2.1.5).
la source