2009-02-25 8 views
12

Qual è il modo più semplice e aggraziato per inviare automaticamente un modulo AJAX quando è selezionata un'opzione di casella a discesa? Sto creando una pagina di amministrazione in cui l'amministratore può modificare le autorizzazioni degli utenti (dove "permessi" è memorizzato come un intero), e vorrei che il campo "permessi" fosse una casella a discesa che automaticamente invia e aggiorna quando l'amministratore fa clic sull'opzione che desidera che l'utente abbia.Rails: invio (tramite AJAX) quando è stata selezionata l'opzione a discesa

Ecco la versione ridotta di ciò che sto attualmente guardando. Devo conoscere il modo migliore per convertire questo in un modulo remoto che invia automaticamente quando si fa clic su un'opzione.

Sentiti libero di indicare qualsiasi suggerimento tangenziale o qualsiasi altra cosa ... Sono relativamente nuovo a Rails, e sto solo raggiungendo il punto in cui posso scrivere codice senza fare costantemente riferimento al lavoro degli altri.

<!-- This is the "index" view, by the way. --> 
<% for membership in @story.memberships %> 
    <% form_for membership do |f| %> 
    <%= f.select :permissions, [['none', 0], ['admin', 9]] %> 
    <% end %> 
<% end %> 

risposta

15

ci sono un paio di modi per gestire questo. Certamente il osservare approccio campo è uno, ma si potrebbe anche utilizzare un semplice javascript o un remote_function per farlo:

Ecco il semplice approccio JS:

<% remote_form_for membership do |f| %> 
    <%= f.select :permissions, [['none', 0], ['admin', 9]], {}, :onchange => 'this.form.submit()' %> 
<% end %> 

L'altro modo sarebbe qualcosa di simile, e avrebbe rifuggono il costruttore modulo (e questo può avere un paio errori di sintassi):

<%= select_tag(:permissions, [['none', 0], ['admin', 9]], {:onchange => "#{remote_function(:url => permissions_path(:story_id => story, 
      :with => "'permission='+value")}"}) 

Personalmente preferisco la prima.

+0

Dopo aver provato entrambe le soluzioni, questo ha finito per lavorare meglio e guardando più bello . Grazie! –

+4

quale il primo o il secondo? – Angela

+1

@ takua108 con chi sei finito? –

4

Tre passaggi!

  1. Crea il tuo form_for a remote_form_for; aggiungi un ID!
  2. Aggiungi un observe_field dopo vostro select
  3. Configurare il observe_field inviare il modulo

L'ultimo pezzo simile a:

<%= observe_field "id_of_select", :function => "$('form_id').submit();" %> 
3

Impara come farlo senza Rails usando la struttura di tua scelta. L'utilizzo dei tag Rails per eseguire AJAX può eseguire rapidamente un'attività, ma può essere molto limitante quando è necessario modificare aspetti specifici su come viene eseguito il tag.

Leggi Standard web e come scrivere javascript discreto su questi siti: http://ajaxian.com/ http://www.alistapart.com/

Sarete in grado di creare più flessibili, interfacce utente sorprendenti imparando come eseguire AJAX senza Rails.

+0

Benvenuti nello Stack. Dovresti sforzarti di fornire risposte specifiche alle domande, oppure potresti essere respinto. Mentre sono d'accordo con te, e penso anche che la mia soluzione this.form.onsubmit() sopra fosse migliore di quella scelta dall'utente, è meglio dare risposte specifiche. –

+0

Grazie Scott. Lo terro 'a mente. Probabilmente dovrei modificare il mio post per includere campioni di stile non invadente. –

4

In Rails 3:

<%= form_for(membership, :remote => true) do |f| %>` 
    <%= f.select :permissions, [['none', 0], ['admin', 9]], {}, :onchange => 'this.form.submit();' %> 
<% end %> 

Si noti che non è this.form.submit(); onsubmit. E non dimenticare il punto e virgola di Javascript.

1

Sto usando Rails 5 & mi è stato anche di fronte alla situazione simile, ma nel mio caso la risposta data da @ Scott non stavo presentando il modulo utilizzando AJAX come previsto se ho aggiunto l'opzione remote: true alla forma (non lo faccio avere il pulsante submit nel modulo).

Se qualcuno sta anche affrontando il problema simile provare a cambiare il codice JS come questo-

<% form_for membership remote: true, id: '#member_form' do |f| %> 
    <%= f.select :permissions, [['none', 0], ['admin', 9]], onchange: '$("#member_form").trigger("submit");' %> 
<% end %> 

Spero che questo aiuti ..

Problemi correlati