2010-08-05 15 views
6

La funzionalità che ho intenzione di fare è inserire alcuni elementi del modulo in base a un numero scelto da un tag select.esegue il rendering parziale da jquery e haml

Ho un tag select chiesto number_of_passengers, e ho intenzione di aggiungere dinamicamente nuovi campi passeggeri per il numero scelto. Diciamo che seleziono 2 da number_of_passengers, quindi 2 form dovrebbero apparire in un fieldset. queste forme contengono il nome, età, ecc peso

ho provato seguendo questo:

call a rails function from jquery?

ed appena convertiti al Haml-parlare ma ottengo gli errori ogni volta che uso il: javascript tag. Anche io non penso di poter "scappare" il tag javascript una volta che sono in esso

:javascript 
    $('#number_of_passengers').change(function() { 
    var $num_of_passengers = $(this).val(); 
    for($i=0; $i<$num_of_passengers;$i++) { 
     $('.passenger-info ul').append('<%= escape_javascript(render :partial => "new_passenger", :locals => {:booking => @booking }) %>'); 
    } 
    }) 

anche perché mi trovo in una form_for, come faccio a passare la variabile @booking al locale? Sembra davvero complicato e sto pianificando di fare la sporca via d'uscita da un loop di 20 volte (20 passeggeri max), quindi nasconderli/mostrarli a seconda del numero selezionato. Ma è troppo sporco, non credi?

risposta

3

i effettivamente riuscito a farlo aggiungendo:

respond_to do |format| 
    format.js { render :partial => "new_passenger" } 
end 

quindi, anche se la richiesta era in js, esso restituisce un html parziale. Nifty

+0

Hai mai provato la mia risposta? Nel caso non fosse chiaro: stavi usando l'interpolazione stile erb all'interno di haml, ma contento di aver trovato qualcosa che funzionasse. – nathanvda

+0

Sto cercando di dare un senso a cosa hai fatto qui, interessato anche a rendere un po 'HTML basato su ciò che è all'interno di un condizionale javascript. Dove esiste "new_passenger"? E la tua risposta, dove hai posto questo codice? – Tass

+0

new_passenger esiste nella stessa cartella di visualizzazione del controller, quindi in il mio caso, bookingcontroller chiamato così era in app/views/prenotazioni – corroded

0

Rails sintassi cambia tutto il tempo, ma non questa

render :partial => "new_passenger", :locals {:booking => @booking }) 

dovrebbe essere

render :partial => "new_passenger", :locals => {:booking => @booking }) 

si può sfuggire javascript all'interno del blocco javascript perché si sta valutando i tag rubino.

Quali messaggi di errore si ricevono?

L'ultima parte della tua domanda non è chiaro per me, ma è questo quello che stai cercando:

- form_for @user do |f| 
    # f.object is equal to @user 
+0

Ciao grazie per la tua risposta. Mi sono lasciato prendere da una malattia. comunque, ho già corretto l'errore di battitura, ma sono ancora perplesso. Cambierò la domanda tra un po 'e ti mostrerò il problema – corroded

12

Per ottenere l'interpolazione di lavoro è necessario fare qualcosa di simile

!= "$('.passenger-info ul').append('#{escape_javascript(render :partial => 'new_passenger', :locals => {:booking => @booking })}'); 

così semplice: aggiungi != all'inizio della riga e includi la stringa tra virgolette.

tua domanda sul @booking: vi consiglio di indagare alcune forme esempi nidificate per renderlo più chiaro per voi (ad esempio this e this Railscast).

+0

hmm grazie! che cosa significa! Mi limiterò a segnalarlo per ora e controllare in futuro perché ho appena usato un j codificato (inserito manualmente il modulo html ... sporco ma funziona). Presto verrà refactored anche se – corroded

+0

Il '! =' significa HTML unescape, quindi inserirà la stringa ruby ​​così com'è, senza sfuggirla. Al contrario del normale '=' che valuta e scappa la stringa, per l'inclusione sicura in HTML. Maggiori informazioni qui: http://haml-lang.com/docs/yardoc/file.HAML_REFERENCE.html # unescaping_html – nathanvda

+1

Ancora più semplice ... usa il: filtro normale (non: javascript). – Karl

Problemi correlati