2009-10-30 5 views
0

J'ai une application Web qui permet aux utilisateurs de modifier les données du modèle via une fenêtre contextuelle. Lorsque le formulaire de fenêtre contextuelle est terminé, l'utilisateur clique sur un bouton "Enregistrer", la fenêtre se ferme et la page d'origine est rechargée pour afficher toutes les mises à jour qui ont été apportées aux données.Méthode du contrôleur Rails pour enregistrer le modèle et fermer la fenêtre contextuelle

Ma technique ne fonctionne que rarement. Je ne peux pas pour la vie de moi comprendre pourquoi cela fonctionne une fois et pourquoi pas un autre.

Dans ma forme de fenêtre pop-up, j'ai ce que la méthode soumettre:

<%= submit_tag("Update Invoice", {:onclick=>"refreshParent()"}) %> 

Ainsi, le Javascript est exécuté idéalement en même temps que le formulaire est soumis au contrôleur. Voici le refreshParent() fonction Javascript:

function refreshParent(id) { 
    window.opener.location.reload(); 
    window.close(); 
} 

Maintenant, la méthode appelée par ma forme (« mise à jour » dans ce cas) ne dispose pas d'un appel de méthode redirect_to, mais même quand je fais (par exemple, à la vue originale, index) cela ne semble pas avoir d'importance.

À la racine, il semble que ma méthode de contrôleur ne se déclenche pas sur le formulaire. Parfois. Je peux soumettre plusieurs fois les mêmes données de formulaire, et cela fonctionnera une troisième fois. Ou parfois ça marche tout de suite. C'est totalement aléatoire.

Que puis-je faire pour m'assurer que les méthodes de mon contrôleur se déclenchent lorsque vous fermez une fenêtre contextuelle?

Merci, Aaron.

Répondre

0

Si je comprends bien, vous voulez que le formulaire sur la page soit publié, mais vous voulez également que la fenêtre que le formulaire fermait. Malheureusement, la façon dont vous l'avez configuré maintenant, il n'y a aucun moyen de vérifier que le formulaire a bien été posté avant de fermer la fenêtre. Ainsi, si la fenêtre se ferme avant la publication du formulaire, la requête peut ne pas aboutir et les données ne seront jamais envoyées à votre contrôleur.

Une meilleure solution serait de publier le formulaire avec Ajax et fermer la fenêtre lorsque la requête Ajax a terminé avec succès.

Une bibliothèque comme jQuery rend Ajax plus simple, il n'y a donc aucune raison de ne pas l'utiliser.

+0

Ah, votre commentaire a fait sonner une cloche dans ma tête! Au lieu d'appeler form_for sur mon formulaire contextuel, j'ai appelé remote_form_for et supprimé l'événement onclick du bouton de soumission. Puis dans le RJS je viens d'entrer les mêmes appels pour fermer la fenêtre et recharger le parent que j'avais dans la fonction séparée: page << "window.opener.location.reload();" page << "window.close();" Boom! Tout fonctionne bien! Merci beaucoup pour vos conseils; pas de jQuery nécessaire! –

+0

J'utilise jQuery avec Rails depuis un moment maintenant et j'ai complètement oublié tous les assistants JS que Rails a intégrés. Heureusement, j'ai pu donner de l'inspiration! –

0

Je suppose que vous rencontrez une combinaison de mauvaises performances JavaScript et de problèmes de latence réseau. Les demandes apparaissent-elles réellement sur le serveur?

Questions connexes