2010-03-04 2 views
5

Dans une application Rails 3, je souhaite que le navigateur appelle une fonction distante lorsqu'une case est cochée. Dans Rails 2, ceci était facile à faire en passantform.submit() missing by rails.js Observateur UJS

:onclick => remote_function(...) 

à l'aide de la case à cocher. Dans Rails 3, le Remote_ * fonctions sont dépréciées, donc j'ai essayé la solution suivante:

  • créer une forme autour de la case à cocher en utilisant form_tag ... :remote => true
  • soumettre le formulaire en appelant $("dummy_form").submit(); du gestionnaire onclick

Dans le fichier rails.js fourni avec Rails, un observateur écoute les événements submit. Cependant, ceux-ci ne semblent être déclenchés que lorsque l'utilisateur clique sur un bouton de soumission, mais pas lorsque form.submit() est appelé (jusqu'à présent testé uniquement dans FF). Cela a l'effet indésirable que l'envoi n'est pas fait en arrière-plan via AJAX, mais de façon normale, de sorte que le navigateur quitte le site actuel et affiche la réponse du contrôleur.

Est-ce que quelqu'un sait une solution de contournement? Peut-être une façon complètement différente d'obtenir la même fonctionnalité?

Répondre

1

Vous pouvez soumettre le formulaire en appelant:

$("dummy_form").request({ 
    onSuccess: function(response) {eval(response)} 
}); 

Ce soumettra le formulaire en utilisant AJAX à l'URL donnée à form_tag et évaluer la réponse reçue, il doit répondre avec JS. Modifiez l'implémentation onSuccess si vous ne le souhaitez pas.

Si la soumission du formulaire est une solution de contournement, comme vous le dites, alors au lieu de soumettre toute la forme, vous pouvez également gérer le clic sur l'événement sur la case manuellement et envoyer un AJAX request:

<%= javascript_tag do %> 
Event.observe(window, 'load', function() { 
    $('CHECK_BOX_ID').observe('click', function(event) { 
    new Ajax.Request('/your/url', { 
     onSuccess: function(response) { 
     // yada yada yada 
     } 
    }) 
    }); 
});