Les meilleures pratiques pour utiliser AJAX sans les assistants intégrés de Rails?

Dans mon application de blog, certaines publications apparaissent sous forme d’extraits: l’utilisateur voit le premier (disons) 500 caractères et peut cliquer sur un lien pour afficher l’intégralité de la publication. Voici le partiel pertinent:

 post) %> 

wrote this ago

length, :omission => "…

Click here for more!

") %>

Cependant, au lieu de “Cliquez ici pour plus!” si vous amenez l’utilisateur sur une page distincte, j’aimerais qu’il remplisse le rest du message en ligne. Actuellement, j’ai implémenté ceci en mettant l’extrait ci-dessus dans le div suivant:

 <div class="post" id="post_">  'post_content', :locals => { :post => post, :length => 500 } %> 

J’utilise ensuite l’id de cette div dans mon application.js pour faire l’AJAX:

 $(document).ready(function() { $("a.more").click(function() { var url = $(this).attr('href'); var id = url.split("/")[2] $.get(url, null, function(data) { $("#post_" + id).html(data); }); return false; }); }); 

Ceci est évidemment dégoûtant – je ne veux pas que mon javascript dépende de l’emplacement de l’identifiant de l’article dans le href du lien, mais je ne connais pas d’autre moyen pour le javascript de savoir quel article il reçoit et donc dans quel article div le contenu devrait être inséré.

Quel est le meilleur moyen d’y parvenir? Devrais-je simplement revenir à l’utilisation des aides AJAX de rails?

Horace, tu as raison. Vous n’avez pas du tout besoin des assistants Rails. Pour réaliser un Nirvana JavaScript discret, vous ferez bien de les éviter (désolé Marc!)

Un JS discret consiste à éviter autant que possible le JS intégré. En effet, essayez de garder les choses faiblement couplées, mais pas entièrement découplées. Dans l’exemple que vous nous avez donné, c’est simple, car nous avons une URL à utiliser avec HREF. Votre SC n’a pas besoin de “savoir” quoi que ce soit sur la manière de demander.

Voici comment envoyer à l’aveuglette un lien à partir du HREF, et demander à Rails de répondre avec une réponse ajax (c’est-à-dire sans mise en page).

SOLUTION:

  

Schwein Flu Ssortingkes Again

B.Obama wrote this 2 seconds ago

SUMMARY SUMMARY

Click here for more!

 /********* Your JavaScript ***********/ $(document).ready(function() { 

/********* Your JavaScript ***********/ $(document).ready(function() {

$ (“a.more”). click (function () {
$ conteneur_div = $ (e) .parents (‘div.body’);
var url = $ (this) .attr (‘href’);
$ .ajax ({
beforeSend: function (request) {request.setRequestHeader (“Accepter”, “text / javascript”); },
/ * Inclus pour que Rails réponde via “format.js” * /
succès: fonction (réponse) {$ (contenant_div) .empty.append (réponse); },
tapez: ‘get’,
url: url
});
retourne faux;
});

});

 ########### Your Controller ########### def show @article = Post.find(param[:id]) respond_to do |format| format.html { render :action => "show" and return } format.js { render :partial => "post_content", :layout => false and return } end end 

Cela suppose également que vous avez des routes RESTful ou similaires pour gérer / publier /: id

Et nous avons fini! Je crois qu’il y a quelque chose en cela pour nous tous. :RÉ

Dans ce cas, je ne pense pas que vous devriez avoir l’appel AJAX du tout. Vous avez déjà l’intégralité du contenu de l’article original dans post.body (vous n’avez pas récupéré uniquement les 500 caractères de la firebase database). Au lieu d’utiliser JQuery pour effectuer un appel en ajax, utilisez-le pour masquer le contenu des 500 clique sur le lien “plus” pour afficher le rest de la div. Vous pouvez le faire entièrement du côté du client et vous épargnez le ajax.

Dans votre partiel:

 
<%= post.body %>

Votre JQuery:

 var fullText = $('div.body').html(); $('div.body').html(fullText.slice(0,499) + 'Click here for more!'); $('a.more').live('click', function(event) { this.parent().html(fullText); return false; } 

À mon avis, pour ce type de problèmes, vous devriez utiliser des aides de rails.

HTML irait comme:

 My post bla bla bla more 

Le plus de lien serait:

 <%= link_to_remote( "more",:update => "more_of_#{your_post.id}",:url =>{:controller => "myposts", :action=>"show_more", :id => your_post.id}, %> 

Et le contrôleur ferait quelque chose comme:

 post = Post.find_by_id(params[:id]) render :text => post.content.slice(100..post.content.size) 

L’autre solution qui pourrait être tout aussi efficace consiste à tout charger puis à le masquer:

 bla bla bla this is my post blah 
and this is the rest of the article

(le clic sur une balise div peut casser dans IE mais c’est pour vous donner une idée)

Pour moi, ce serait la meilleure voie à suivre sauf si vous avez une bonne raison d’éviter les aides des rails.

J’espère que cela pourra aider