Form multibutton con JQuery. Come fare?

Ciao a tutti,
domandina a tutti quelli che usano jquery con rails:

Se voglio rendere la chiamata submit di un form in una chiamata ajax
basta inserire in application.js il seguente codice:

$(’#new_user’).submit(function(){
$.post($(this).attr(‘action’), $(this).serialize(), null,
“script”);
return false;
});

ma cosa fare se si hanno piu’ submit button nel form inquestione ?

ho notato che il controller nn riceve in parameters il classico
parametro “commit”=>“Inserisci”, con cui potrei discrimirare i vari
button del form

grazie !
Alessandro

Se devi farlo in Ajax allora hai già deciso di usare JavaScript e quindi
potrebbe essere accettabile fare del tutto a meno dei submit button.

Non so se usi jrails per rimpiazzare gli helper di prototype con gli
helper jQuery o se scrivi il codice JS a mano. Se usi gli helper, al
posto dei submit button puoi usare dei link_to_remote e passare i
parametri del form con l’opzione :with. Puoi discriminare tra un link e
l’altro o chiamando action differenti o passando un ulteriore parametro
nella POST HTTP. Se scrivi il codice a mano puoi vedere cosa generano
gli helper e convertirlo nell’analogo codice jQuery.

Per coincidenza ho usato questa tecnica proprio in settimana, ma ci
saranno anche mille altre soluzioni. Sono curioso di vedere cosa
proporrà il resto del forum.

Paolo

Ale Ds wrote:

Ciao a tutti,
domandina a tutti quelli che usano jquery con rails:

Se voglio rendere la chiamata submit di un form in una chiamata ajax
basta inserire in application.js il seguente codice:

$(’#new_user’).submit(function(){
$.post($(this).attr(‘action’), $(this).serialize(), null,
“script”);
return false;
});

ma cosa fare se si hanno piu’ submit button nel form inquestione ?

ho notato che il controller nn riceve in parameters il classico
parametro “commit”=>“Inserisci”, con cui potrei discrimirare i vari
button del form

grazie !
Alessandro

Il 05 novembre 2009 16.43, Ale Ds [email protected] ha scritto:

});

ma cosa fare se si hanno piu’ submit button nel form inquestione ?

ho notato che il controller nn riceve in parameters il classico
parametro “commit”=>“Inserisci”, con cui potrei discrimirare i vari
button del form

ciao,

secondo me, se non hai un motivo valido per farlo, non è il caso di
rinunciare a usare i submit, perché, tenendoli, rendi il form
funzionante sia con che senza js.

Proposta quick and dirty:

nel js:

function crea_hidden(obj) {
return ‘’
}

$(‘.pulsante’).click(function()
{$(‘#new_user’).append(crea_hidden($(this))); return true; });

$(‘#new_user’).submit(function(){
$.post($(this).attr(‘action’), $(this).serialize(),
null,“script”);
return false;
});

In questo modo il controller riceve gli stessi dati sia via ajax che
non.

Nota forse ovvia: non conviene mai discriminare in base al valore del
submit, dato che può essere localizzato, ma piuttosto in base al nome
del campo, cioè con:
e, quindi, nel controller,

if params[:questo]

end

pietro

un semplice :

$(’.pulsante’).click(function()
{
if ((this).attr(‘name’) == “questo”) {
fai qualcosa…
}
else {
fai qualcos’altro…
}
$.post($(“form_id”).attr(‘action’), $(this).serialize(),
null,“script”);
return false;
});

Alessandro S. wrote:

$(’.pulsante’).click(function()
{
if ((this).attr(‘name’) == “questo”) {
fai qualcosa…
}
else {
fai qualcos’altro…
}
$.post($(“form_id”).attr(‘action’), $(this).serialize(),
null,“script”);
return false;
});

grazie per la proposta,
tuttavia non conviene mettere della logica nelle view,
preferirei tenerla nel controller e fare qualcosa tipo
if params[:button_a]

elsif params[:button_b]

end
il punto e’ che con Ajax non vengono passati nome e valore del parametro
button {‘name_button’ => ‘value_button’} (e non so perche’:), tranne che
con il metodo suggerito da Giorgian, che propone di creare espicitamente
un campo nascosto:




nel js:
function crea_hidden(obj) {
return ‘’
}
$(’.pulsante’).click(function()
{$(’#new_user’).append(crea_hidden($(this))); return true; });
$(’#new_user’).submit(function(){
$.post($(this).attr(‘action’), $(this).serialize(), null,“script”);
return false;
});

Se nn trovo una soluzione piu’ elegante penso di usare questa.

Grazie,
Ale DS

PS.
nella tua soluzione penso ci sia un piccolo errore:
invece di $(this).serialize() va usato $(“form_id”).serialize() per
poter passare i parametri del form:

$.post($(“form_id”).attr(‘action’), $(“form_id”).serialize(),
null,“script”);

Proposta quick and dirty:

nel js:
function crea_hidden(obj) {
return ‘’
}

$(‘.pulsante’).click(function()
{$(‘#new_user’).append(crea_hidden($(this))); return true; });

$(‘#new_user’).submit(function(){
$.post($(this).attr(‘action’), $(this).serialize(), null,“script”);
return false;
});

In questo modo il controller riceve gli stessi dati sia via ajax che
non.
Non ho ancora provato la tua sol. ma la trovo davvero interessante, in
particolare l’uso di:
$(‘#new_user’).append(crea_hidden($(this))); return true; }

Tuttavia ancora nn ho capito perche’ il parametro {‘name_button’ =>
‘value_button’} nn viene passato quando si usa Ajax (da cui nasce il
problema), nel mio caso quando uso:

$(‘#new_user’).submit(function(){
$.post($(this).attr(‘action’), $(this).serialize(), null,
“script”);
return false;
});

ne hai idea ?

questa sol. come tu dici e’ quick and dirty, hai in mente qualche sol.
piu’ “pulita” ?

Nota forse ovvia: non conviene mai discriminare in base al valore del
submit, dato che puo’ essere localizzato, ma piuttosto in base al nome
del campo, cioe’ con:
e, quindi, nel controller,

if params[:questo]

end

sono d’accordo, anche Rayan B. usa questa tecnica
(#38 Multibutton Form - RailsCasts)

ciao,
Alessandro

Il 06 novembre 2009 13.21, Ale Ds [email protected] ha scritto:

ne hai idea ?
francamente no, e infatti all’inizio non avevo proprio capito il tuo
messaggio, ho dovuto provare il codice per rendermene conto, e credevo
di sbagliare qualcosa…

questa sol. come tu dici e’ quick and dirty, hai in mente qualche sol.
piu’ “pulita” ?

A dire il vero no, ma in effetti c’è molto di peggio.

Ho appena provato a fare una veloce ricerca online, e ho trovato
esattamente questa discussione su stackoverflow.com (che ultimamente è
la mia fonte principale di informazioni):

nessuna delle soluzioni proposte mi piace.

In particolare, uno propone di fare $(‘form’).serialize() +
‘&this=“sì”’ (oppure ‘&that=“no”’, a seconda), che era la prima cosa a
cui avevo pensato, ma l’ho scartata perché mi sembra ancora più
un
hack rispetto all’inserimento di un hidden, e in più perché non
funziona se il form è vuoto (in quel caso la ‘&’ non ci andrebbe).

pietro

quì discutono proprio il tuo problema:

Secondo me la soluzione più bella è avere codice javascript unobtrusive
ossia aggiungere il comportamento ajax al tuo form, qualcosa tipo
questo:
‘form.remote’: Remote.Form

Quando vuoi rendere un form anche ajax basta aggiungere class=“remote”

Quel codice è familiare a chi usa lowpro, per me è diventato un must
have, quà un esempio:

Poi per usare molteplici submit, secondo me conviene indirizzare tutti
in un unico punto nel controller, al limite, se le operazioni sono molto
diverse, si può creare una routes apposita che smisti le richieste.

if params[:name_submit1]
#primo submit
elsif params[:name_submit2]
#secondo submit
else
#altri submit
end

si può anche chiamarli tutti commit, basta comparare il valore
localizzato:

case params[:commit]
when t(:name_submit1)
#primo submit
when t(:name_submit2)
#secondo submit
else
#altri submit
end