2010-01-15 4 views
0
fond

J'ai un remote_form qui fonctionne à 100%Rails demande ajax

Lorsqu'un utilisateur clique soumettre, il sort donc grappins données de la db ou les données grattées d'un autre site, et met à jour la page de façon transparente ...

Le problème que j'ai maintenant, c'est que je voudrais faire la même chose, mais faites-le sans que l'utilisateur clique sur le bouton soumettre avec un événement onload. Je pense que je vais dans le mauvais sens:

Techniquement cela fonctionne ... il obtient les bonnes données, mais au lieu de faire exactement ce que remote_form_tag fait, il retourne les données brutes. Pas de RJS replace_html.

Existe-t-il un moyen d'ignorer complètement le formulaire et de simplement exécuter l'action du contrôleur directement lors du chargement de la page?

<script type="text/javascript"> 
    $(window).load(function() { 
     // executes when HTML-Document is loaded and DOM is ready 
     // jQuery.facebox('Big loading! <img alt=\"Loading\" src=\"/images/loaders/loading.gif\" />'); 
     //$("#update_form").submit(); 
     $("#update_form").submit(function() { return false; }); 

    }); 
</script> 

Le formulaire de

#html.erb 
<% form_remote_tag :url => { :action => "update_availables", :id => params[:id] }, 
    :loading => "jQuery.facebox('Big loading! <img alt=\"Loading\" src=\"/images/loaders/loading.gif\" />');", 
    :html => { :method => "get" }, 
    :method => "get", 
    :html => { :id => 'update_form' } do %> 

Le contrôleur

def update_availables 
    @do_it = Available.get_new_availables :id => params[:id], :date => user_cart.getDate.to_s 
    get_availables 

    respond_to do |format| 
     format.html 
     format.js 
    end 
    end 

RJS

page.replace_html :rooms, :partial => "available" 
page << "jQuery.facebox.close();" 

Répondre

4

Eh bien, pour obtenir les mêmes fonctionnalités que l'utilisateur clique sur la forme vous pouvez utiliser le javascript click méthode:

$(window).load(function() { 

    $("#update_form input[type='submit']").click(); 

}); 

Mais, si vous soumettez sans aucune intervention de l'utilisateur, pourquoi mettre les données sous une forme du tout, pourquoi ne pas mettre juste un appel ajax dans le gestionnaire de charge qui appelle l'action et met à jour le code directement?

$(window).load(function() { 

    $.ajax({ 
     type: "GET", 
     url: "scraper_url", 
     data: {field1:val,field2:val}, 
     success: function(responseText){ 
     // update page 
     } 
    }); 

}); 
1

Je suis d'accord avec floyd ici. La façon dont j'aborde habituellement ce type de choses est de renvoyer les données JSON nécessaires à partir des actions Rails plutôt que d'utiliser RJS pour mettre à jour la page. Cela a les avantages que JSON est généralement très rapide à générer, et il peut facilement être déplacé vers le modèle en tant que méthode to_json et réutilisé dans de nombreux contextes différents.

Si la mise à jour de la page est simple, il n'y a pas de raison que vous ne puissiez pas le faire en ligne, mais si elle est plus complexe, vous pouvez la définir comme fonction dans un fichier javascript statique. La bonne chose à propos de cette approche est qu'elle maintient votre code javascript et ruby ​​plus modulaire et découplé. Il est plus facile de déboguer et d'effectuer des tests unitaires parce que le code javascript est indépendant de lui-même plutôt que d'être «abstrait» (plus ou moins obscur) par les méthodes RJS limitées. Vous bénéficiez également de certains avantages en matière de performances grâce à la mise en cache statique des fichiers javascript.

Si vous regardez autour du Web, vous remarquerez qu'il n'y a pas beaucoup de mention de RJS récemment dans les blogs Rails. C'est parce que RJS était une idée géniale en 2006, mais est tombé en désuétude, car les meilleures pratiques de javascript ont évolué. Pour comprendre cela, vous devez regarder l'histoire d'AJAX. Rails a été l'un des premiers frameworks à avoir intégré le support AJAX en 2005, et il l'a fait en utilisant Prototype qui était vraiment le premier framework Javascript moderne mais qui était encore assez approximatif. À l'époque, un très grand nombre de développeurs Web cherchaient à éviter le Javascript, qui avait une réputation terriblement mauvaise en raison d'incompatibilités DOM. Par conséquent, les gens étaient un peu trop sollicités pour tout ranger avec des aides de Rails.C'était génial quand les gens ont été séduits par AJAX très simple, mais comme les frameworks Javascript ont mûri et que les gens sont devenus plus ambitieux avec leur fonctionnalité Javascript, il est devenu clair que Javascript mérite d'être un citoyen de première classe. De nos jours, jQuery rend les tâches javascript courantes si concises et élégantes que les premiers utilisateurs de Rails semblent maladroits même lorsque leur fonctionnalité par défaut fonctionne. Il y a probablement encore de bons cas d'utilisation pour RJS, mais je ne l'ai pas utilisé depuis des années et je ne l'ai pas manqué du tout.

Mon conseil est d'adopter Javascript. Ramassez Javascript: The Good Parts par Douglas Crockford, puis passez beaucoup de temps avec jQuery. Vous serez bien récompensé.

+0

Tout à fait d'accord sur l'évanouissement de l'utilisation de RJS. C'était une idée intelligente, mais je n'ai jamais aimé ça en pratique. Bien sûr, il est maintenant difficile de faire en sorte que les développeurs fassent tout leur JS personnalisé discret ... – tfwright