Question

Avec Rails v2.1, disons que vous avez une action pour un contrôleur accessible depuis plusieurs emplacements. Par exemple, dans l'application Rails, vous disposez d'un lien permettant de modifier un utilisateur à partir de deux vues différentes, l'une sur la vue Index des utilisateurs, l'autre sur une autre vue (dans la barre de navigation de chaque page, par exemple).

Je me demande quel est le meilleur moyen de rediriger l'utilisateur au bon endroit en fonction du lien sur lequel il a cliqué. Par exemple:

Exemple 1:

  1. Lister tous les utilisateurs
  2. Cliquez sur "modifier". sur un utilisateur de la liste
  3. L'utilisateur clique sur " enregistrer " sur le formulaire, le contrôleur redirige vers 1.

Exemple 2:

  1. L'utilisateur peut figurer sur n'importe quelle page de l'application. La barre de navigation affiche un lien permettant de modifier l'utilisateur actuel
  2. .
  3. L'utilisateur clique sur le lien pour modifier
  4. L'utilisateur clique sur "Enregistrer". sur le formulaire, le contrôleur redirige vers la page sur laquelle ils se trouvaient lorsque l'utilisateur cliquait sur le lien "modifier". lien dans la barre de navigation.

Je l'ai déjà vu faire par:

  1. Placement d'un paramètre sur le lien d'édition original avec le contrôleur / l'action d'origine dans lequel le lien est apparu. Pour rendre cela plus sec, vous pouvez utiliser @ controller.controller_name et @ controller.action_name dans un assistant.
  2. Le contrôleur enregistre les paramètres dans une variable de session.
  3. Une fois que le contrôleur a sauvegardé l'enregistrement, il redirige vers la variable de session.

Ce que je n'aime pas particulièrement dans cette solution, c'est la nécessité d'ajouter le paramètre à chaque lien applicable dans les vues. Je me demande s’il existe un moyen de construire tout cela dans le contrôleur.

Une meilleure façon de penser était de:

  1. Placez un before_filter sur le champ "edit". action pour enregistrer le référent (est-ce suffisamment fiable?) dans la session.
  2. Quand " mettre à jour " est atteint, le contrôleur redirigera vers la variable de session puis supprimera la variable de session.

Avez-vous des idées sur la meilleure façon de procéder?

Était-ce utile?

La solution

Je pense que l'utilisation de before_filter sur l'action de montage est la moins intrusive.

Le référant doit être suffisamment fiable ... ayez simplement une valeur par défaut si aucun référent n’est disponible (disons: quelqu'un a mis en favori la page de modification) et tout devrait bien se passer.

Autres conseils

Flash : les données que vous utiliserez uniquement pour la demande suivante peuvent être stockées en mémoire flash. Dans ce cas, vous n'avez pas besoin de le nettoyer automatiquement. Cela fonctionne bien pour un nombre limité de contextes d'application dont vous êtes sûr de n'avoir besoin qu'une fois, pas seulement pour les messages d'erreur!

Je sais ce que vous avez fait lors du dernier accès HTTP : s'il vous suffit de rediriger les utilisateurs vers la dernière URL à laquelle ils se trouvaient, faites-le. request.referer va, pour la plupart des navigateurs qui ne bloquent pas les informations, vous donner la dernière URL à laquelle se trouvait la personne.

#in edit controller
...
flash[:page_to_redirect_to] = request.referer || "/my/default/path"
...

#in save controller
redirect_to flash[:page_to_redirect_to] || "/my/default/path"

Je ne suggérerais pas de coder en dur ceux-ci, par hasard.

before_filter : de nombreux développeurs Rails l'utilisent comme leur marteau préféré et transforment le reste en clous. Les filtres sont utiles lorsque vous souhaitez exposer des fonctionnalités à toutes ou à toutes les méthodes d’un contrôleur. Je ne sais pas si c'est nécessairement le cas ici, mais votre kilométrage peut varier. Vous pouvez combiner le filtre avec les deux astuces ci-dessus, si nécessaire.

Une autre approche consiste à charger le formulaire dans une superposition, comme http://flowplayer.org/ tools / overlay / index.html , puis sur ajax submit, vous pouvez fermer la superposition. Je le fais en combinaison avec un autocomplete pour offrir un "ajout de nouveau". option. Une fois que le formulaire de superposition est soumis, je retourne des données au format json, sur lesquelles on agit pour remplir la saisie semi-automatique. (J'ai créé mon propre plug-in pour vous aider dans tout cela.

Cela demande un peu plus de travail, mais cela fonctionne vraiment bien pour l'utilisateur final.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top