link_to e remote => true + jquery: come? Aiuto?

Sto cercando di creare un link “Utenti” sul sito web dell’indice dei miei binari in modo che mostri gli utenti registrati (User.all) MA voglio che appaia nella parte destra del sito, come parziale, in un div senza caricamento dell’intera pagina dall’inizio.

Sapevo che questo era ansible con il vecchio prototipo e remote => true ma con Rails 3.1 e jQuery (e risorse) non ho idea di come farlo.

Qualcuno può aiutarmi o mostrarmi la strada per un tutorial?

In realtà è abbastanza semplice, sembra davvero un grosso problema perché è nuovo. Fondamentalmente, con il nuovo discreto supporto javascript, lo script ujs delle barre espone una serie di eventi a cui è ansible associare le funzioni javascript, sono:

  1. ajax: beforeSend – sparato prima che l’invio abbia luogo
  2. ajax: successo – triggersto dopo l’invio, contiene la risposta
  3. ajax: completato – sparato dopo l’evento di successo
  4. ajax: errore – triggersto quando sono presenti errori

tutto quello che devi fare è scrivere una funzione (che tieni a capo in $ document.ready) che a turno lega alcune funzioni anonime a ciascuno di questi eventi, o solo agli eventi che ti interessano.

Ad esempio, supponiamo di avere un div in cui vuoi inserire i dati di risposta con un id di “response_data” e hai un link con un id di “ajax_trigger”. Qualcosa come questo:

<%= link_to "My Link", some_model_path(@model_instance), :remote => true, :html => {:id => "ajax_trigger"} %> 

Tutto quello che devi fare è fornire una funzione come quella qui sotto per mettere la risposta dal server nel div:

 $(document).ready( function(){ $("a#ajax_trigger").bind("ajax:success", function(evt, data, status, xhr){ //this assumes the action returns an HTML snippet $("div#response_data").html(data); }).bind("ajax:error", function(evt, data, status, xhr){ //do something with the error here $("div#errors p").text(data); }); }); 

In realtà, tutto ciò che stai facendo con il javascript sta gestendo la risposta quando ritorna dal server. Non devi fare nulla di speciale per avviare la richiesta XHR e puoi anche archiviare questo metodo in modo sicuro nel file .js che viene pubblicato come asset statico. Se stai usando Rails 3.1, dovresti inserirlo nel file javascript appropriatamente denominato che corrisponde al controller. Nel tuo controller devi assicurarti di specificare: layout => false nel metodo responds_with (), in questo modo il controller restituisce solo il partial o il template che rende, piuttosto che una pagina completa. Questa configurazione funziona anche con azioni che restituiscono javascript da eseguire sia dal client che da JSON, a seconda del tipo di dati specificato nella richiesta.

Ho trovato questo post del blog molto utile: http://www.alfajango.com/blog/rails-3-remote-links-and-forms/

Ecco una lista di risorse utili:

  • Rails 3 Link e moduli remoti: una guida definitiva
  • Rails link_to documentation
  • Assistenti JavaScript discreti in Rails 3